NuGetとは？NuGet使って共有ライブラリーの管理


# NuGetとは

NuGetは、.NET開発のためのパッケージマネージャーです。パッケージとは、ライブラリやツールのような再利用可能なコードの単位を指し、これを効率的に管理・導入することができるツールがパッケージマネージャーとなります。NuGetは、このようなパッケージを簡単にインストール、アンインストール、更新する作業をサポートします。

現在データ管理するプロジェクトを進めていますが、ここでは複数のプロジェクトが存在し、データの定義を共有する必要があります。単一ソリューションであれば、ソリューションの中にライブラリーがあればいいのですが、複数ソリューションや、まったく別のソリューションを管理している際に、参照先のライブラリーを管理することは困難、という時に登場するのがNuGetです。既に皆さんはプロジェクトでASP.Net Coreなど、いくつかライブラリーを参照していますが、これらはNuGetによって管理されています。この仕組みを使って自分たちで使っているデータ定義（クラスライブラリー）を管理しようというのが、今回の目論見です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/8ffcfa74-242d-2222-bccb-ab577df352d9.png)



NuGetパッケージが更新されると自動で通知が行ったり、設定によっては自動で更新されたりするのでとても便利です。.NETで開発している人からするととても便利です。

例えば下記のようなデータ定義をしたとします。

```csharp
  public class Thing
  {

      // Thing
      public string AdditionalType { get; set; }

      public string AlternateName { get; set; }
      public string Description { get; set; }
      public string DisambiguatingDescription { get; set; }
      public string Identifier { get; set; }
      public string Image { get; set; }
      public string Name { get; set; }
      public string PotentialAction { get; set; }
      public string SameAs { get; set; }
      public string SubjectOf { get; set; }
      public string Url { get; set; }
  }
  ```

  この定義を様々なプロジェクトで共有し、更新までも管理していくんとなると大変になります。なので、これをNuGet上で管理することで、この定義を更新するたびにすべてのプロジェクトで最新の定義を参照することができます。

## 公開NuGetと非公開NuGet

今日は公開されるNuGetパッケージに関して話を進めていますが、公開したくない、社内のみで利用を想定しているNuGetパッケージもあるかと思います。こちらは、また別の機会にお話ししたいと思いますが。自社でNuGetサーバーを用意して配信したりもすることができます。

# 準備

まずはNuGetの管理単にであるパッケージを用意します。VisualStudioにて、クラスライブラリープロジェクトがある前提で、プロジェクトを右クリック、「プロパティ」、「パッケージ」と進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/839cb4ba-415c-38ca-8057-07a62bc3b44f.png)

ここで重要なのはビルド時にNuGetパッケージを生成がチェックされていることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/1f1b1e24-79b3-2f49-da74-12b37400dd26.png)

他のプロパティーは良しなに進めていきましょう。

そして実際にビルドをしてみると、下記のように`.nupkg`が作成されたよ、と出てきます。これで準備完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/effea87a-2236-da0c-7050-36403e8de0c0.png)


# 更新

次にNuGetへ移動します、ここでは既にアカウントを持っているものとします。

https://www.nuget.org/ 

ログイン後、「Upload」から先ほど生成したファイル `.nupkg`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/9c371729-bc53-ff1d-83d8-8c6dfaf3a25d.png)

## ライセンス

さて、進めてみたらこんな警告がでてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/41a0d4a9-60e2-ed99-88b1-6df769965efa.png)

ライセンス設定していないぞ、と。ライセンスに関しては、また別の機会にまとめたいと思いますが、公開するものであれば、ライセンスを必ず設定してください。

## 公開待ち

パッケージのアップロードは完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/ab2cc356-1028-6a48-9e9a-269c9430e9fc.png)

この画面にもあるように、まだ、公開はされていませんが、しばらくしてから公開されるます、このまま待機して、公開完了メールを待ちます。

# 確認

では、自分で公開したNuGetパッケージが利用可能か確認してみます。　別のソリューションを開いて、プロジェクト上を右クリック、NuGetパッケージの管理、検索部分にパッケージ名を入力してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/2019af47-1f98-d21f-5992-ee58cadef88f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/b60578d5-f4c3-a268-6fda-c45ae6cceebc.png)

実際にコードの中でアップロードしたクラスを参照してみます。ここでは先ほどのThingという定義を使ってThingを戻してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/01c079bd-d69e-0fa6-d2a3-e7930328687d.png)


---

今日は一通り、NuGetでパッケージをリリースするところまで進めてみました。外部にバージョンを表記するばあいはshields.ioなどを使って共有していくこともできます。　便利なクラスを作ったら公開してみてください。たくさんの人が利用する日が来ると思います、そしてそれで、開発管理工数が飛躍的に効率化されると思います。ではでは。