共有フォルダを利用してnugetパッケージを管理する方法

# 🔰 はじめに
![3025413_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/b49c5302-fafa-cc9c-c15d-41449a47ad4e.jpeg)

通常、nuget パッケージを管理する場合には nuget.org を利用するか nuget サーバを作成して管理することが多いと思います。

ただ、小規模な企業や事務の方々にはなかなかにハードルが高いと思います。
これは技術的な話だけではなく、コンプライアンスやインフラ導入までの手続き的な意味も含めてです。

そこで今回はオープンな場での nuget パッケージの管理は禁止されており、なおかつ nuget サーバを独自で導入するのも難しい方向けのソリューションを紹介します。



# 🚨 注意事項

今回紹介する方法では共有フォルダにアクセスできる人間であれば誰でも自由に nuget パッケージを追加・編集・削除できてしまうので注意が必要です。
気休め程度ですが隠しフォルダにするなどの対応や、アクセス権限をいじれるのであれば適切なアクセス権限の付与を行うなどの対策が必要です。
あくまでも本来やらねばならないことをすっ飛ばして簡易的に nuget パッケージを管理したい場合の代替案だということは胸に深く刻んでおきましょう。



# 📖 How To

## 1. nuget パッケージを作成する

何はともあれ、管理したいライブラリがなければ話は進まないため、簡単なライブラリを用意していきます。
.NET Core を利用している場合は非常に簡単に dll プロジェクトから nuget パッケージを作成することができます。


### a. dll プロジェクトを作成

まずは適当な位置にプロジェクトを作成します。
今回は F# でサンプルを作成していますが C# でもまったく同じ方法で実現可能です。

```powershell:powershell
dotnet new classlib -lang="F#" -o="SampleProject"
```

すると、以下のようなプロジェクトが作成されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/8159e1c7-01f2-7d3e-282b-b9717891c90a.png)

今回はライブラリの中身にあまり興味がないため、デフォルトのまま進めます。


### b. nuget パッケージを作成

通常の dll を作成する場合は **`dotnet build`** コマンドを使って

```powershell:powershell
dotnet build -c="Release"
```

とするだけで作成できます。

nuget パッケージを作成する場合には **`dotnet pack`** コマンドを使って

```powershell:powershell
dotnet pack -c="Release"
```

とすれば簡単に作成することができます。
作成された nuget パッケージは **`.nupkg`** という拡張子で Relase フォルダに出力されます（デフォルトの場合）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/fa6c2191-9d20-ad17-992c-cd1e6632be7a.png)

 **`dotnet pack`** コマンドには他にもいろいろなオプション機能があるので **[公式HP](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-pack)** を参考にカスタマイズしてみてください。



## 2. nuget パッケージ管理用のフォルダを用意する

それでは作成した nuget パッケージを管理するためのフォルダを用意します。
と、いっても共有フォルダ上に１つフォルダを作成するだけなので、なんてことない作業です。

今回は ~~共有フォルダを用意するのが面倒だったので~~ Dドライブ直下にフォルダを用意しています。

```powershell:powershell
mkdir D:/nuget
```

フォルダ名は nuget としましたが、別になんでも問題ありません。

フォルダを作成したら、ココに nuget パッケージを移動します。
以下のようになっていれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/2369d892-ed1c-445c-d476-a5af2cc32738.png)



## 3. dotnet コマンドが管理用フォルダを参照できるようにする

現状のままでは dotnet コマンドが nuget パッケージ管理用フォルダを参照してくれていないので、参照してくれるように設定をしていきます。
設定には **`dotnet nuget add source`** を利用します。

```powershell:powershell
# dotnet nuget add source <nuget パッケージ管理用フォルダのパス> -n <リソースの名称>
dotnet nuget add source "D:\\nuget" -n "Local Nuget Resources"
```

上記のコマンドを実行すると以下のようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/85198d87-6959-40c5-97a7-0d8ff892bc1c.png)

本当に追加されたかは **`dotnet nuget list source`** コマンドで確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/c29ac8be-ab89-3446-2163-3c4ee8b241f6.png)

これで dotnet コマンドを利用して nuget 管理用フォルダで管理している nuget パッケージを追加することができるようになりました。



## 4. nuget 管理用フォルダ内のパッケージを利用してみる

それでは簡単なコンソールアプリを作成して、先ほど作ったサンプルライブラリのパッケージを利用してみましょう。
パッケージの追加は **`dotnet add package`** コマンドを利用します。

```powershell:powershell
# コンソールアプリのプロジェクトを作成
dotnet new console -lang="F#" -o="SmpleConsole"
# カレントディレクトリを SampleProject にする
cd "./SampleProject"
# nuget パッケージをプロジェクトに追加する
dotnet add package SampleProject
# VS Code で開く
code .
```

上記のコマンドを順次実行するだけで準備は完了です。
**`Program.fs`** を以下のように修正して実行してみましょう。

```fsharp:Program.fs
// さきほど作成した SampleProject を open できるようになっている
open SampleProject

"Midoliy"
|> Say.hello
```

```powershell:powershell
# dotnet run コマンドを利用して実行
dotnet run
```

実行結果は以下のようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/7e69005d-4fe2-ec49-81fa-fc29716d931b.png)

これで簡単に nuget パッケージが管理できるようになりました。



## 5. nuget パッケージがバージョンアップした場合に更新する

### a. nuget パッケージのバージョンを上げる

それでは nuget パッケージのバージョンを上げてみましょう。
1. で作成した SampleProject のバージョンを 2.0.0 に上げてみます。
以下のように **&lt;Version&gt;&lt;/Version&gt;** 要素を追加します。

```xml:SampleProject.fsproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <Version>2.0.0</Version>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Library.fs" />
  </ItemGroup>

</Project>
```

あとは同じ手順で nuget パッケージを作成し、nuget パッケージ管理用フォルダに移動させます。
以下のような形になっていれば正解です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/33301571-15f5-fbb7-f693-ab4ceb9a3a74.png)


### b. コンソールアプリで参照している nuget パッケージのバージョンを更新する

次に 4. で作成したコンソールアプリの方を更新します。
更新方法は簡単で、もう一度 **`dotnet add package SampleProject`** を実行するだけです。

```powershell:powershell
# カレントディレクトリを SampleProject にする
cd "./SampleProject"
# nuget パッケージをプロジェクトに追加する
dotnet add package SampleProject
```

すると nuget パッケージが最新のものに更新されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/ebc20893-4591-51dd-8d00-4c30b1a81880.png)



# 💡おわりに
![connect-316638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/3cfa07ff-f744-d943-06c9-66de29b22191.jpeg)

今回は dotnet コマンドを利用して、環境によらない方法での紹介としましたが Visual Studio を利用できる環境であればさらに簡単に済ませることができます。

こういったケースで困ることはあまりないと思いますが、何かしらの一助になれば幸いです。