NuGetの役割とNuGetの使い方について【C#, visutal studio】

便利な機能を使おうと調べると「NuGetでインストール」とか
「パッケージマネージャーを使って機能を追加」とか検索で出てくるけどいったいなんなの?

という方向けに

  • NuGetとは
  • パッケージマネージャーとは
  • なぜパッケージマネージャーが必要なのか
  • NuGetの使い方

を紹介します。使い方だけ知りたい方はリンクから飛べます。

NuGetとは

C# で使用するパッケージマネージャーのことです。

パッケージマネージャーとは【開発済みの機能をダウンロードし使う】

「いやいやパッケージマネージャーがわからん」
という人向けに、パッケージマネージャーそのものについて説明します。

C#に限らずjs・rust・java・etc.あらゆる言語に「パッケージ」があり「パッケージマネージャー」があります。

ここでいう「パッケージ」はすでに開発されいろいろな製品に組み込めるように作られた機能です。
世には数多くの便利機能が公開されていて、利用することができます。

例えば、CSV出力や読み込み機能、DB接続機能、http通信機能などはすでに先人たちの手によって高品質な機能が提供されています。

そして、それらは大抵は無料で利用できますし、
自分でCSV出力などを自作するよりも、時短などメリットが大きいです。

パッケージマネージャーが必要な理由【面倒な手動作業を自動でやってくれるから】

後述しますが、NuGetはボタンクリック一発でインストールできる優れモノです。
ではNuGetがやってくれることを手動でやるとどうなるのか?
経験上、まともにコードが動かなくなる人が出てきます。

NuGetが自動でやってくれること

jsonライブラリをNuGetでインストールした後

C#でパッケージを利用しようとしたとき、大抵は2段階で利用します。

  1. プロジェクト単位で利用する
  2. ファイル単位で利用する

List型とかは最初から含まれているものは、「ファイル単位で利用する」だけで使えます。つまりusingでインポートすればすぐ使えます。

しかし、最初から含まれていないものは、プロジェクトにインストールする必要があり、このプロジェクトにダウンロードしてインストールするところまでをNuGetがやってくれるのです。

もしNugetがやってくれることを手動でやろうとすると依存関係解決という作業で地獄を見るかもしれません。

NuGetが依存関係を自動で解決してくれる

手動でパッケージを追加するとき、「まともにコードが動かなくなる」のは依存関係を正しく解決できないときにおこります。

実際のところjsonパッケージくらいであれば手動でダウンロードして追加することもできなくはないです。

しかし、自分が使いたい機能が単純な依存関係で構成されているとは限りません

例えば、ASP.netでWebアプリケーションの場合でみてみましょう。

Webアプリを自分でパッケージを手動で組み立てると以下のパッケージを全て手動でインストールしていく必要があります。

Microsoft.AspNetCore.Mvc.Coreの依存関係
.NETStandard 2.0
Microsoft.AspNetCore.Authentication.Core (>= 2.2.0)
Microsoft.AspNetCore.Authorization.Policy (>= 2.2.0)
Microsoft.AspNetCore.Hosting.Abstractions (>= 2.2.0)
Microsoft.AspNetCore.Http (>= 2.2.0)
Microsoft.AspNetCore.Http.Extensions (>= 2.2.0)
Microsoft.AspNetCore.Mvc.Abstractions (>= 2.2.0)
Microsoft.AspNetCore.ResponseCaching.Abstractions (>= 2.2.0)
Microsoft.AspNetCore.Routing (>= 2.2.0)
Microsoft.AspNetCore.Routing.Abstractions (>= 2.2.0)
Microsoft.Extensions.DependencyInjection (>= 2.2.0)
Microsoft.Extensions.DependencyModel (>= 2.1.0)
Microsoft.Extensions.FileProviders.Abstractions (>= 2.2.0)
Microsoft.Extensions.Logging.Abstractions (>= 2.2.0)
System.Diagnostics.DiagnosticSource (>= 4.5.0)
System.Threading.Tasks.Extensions (>= 4.5.1)

さらに、Microsoft.AspNetCore.Mvc.Coreに含まれる子パッケージMicrosoft.AspNetCore.Httpも依存関係がありますので、そちらも解決してかないといけません。


Microsoft.AspNetCore.Httpの依存関係
.NETStandard 2.0Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
Microsoft.AspNetCore.WebUtilities (>= 2.2.0)
Microsoft.Extensions.ObjectPool (>= 2.2.0)
Microsoft.Extensions.Options (>= 2.2.0)
Microsoft.Net.Http.Headers (>= 2.2.0)

でないと、コンパイルが通らず動かなくなります。
同じことが子パッケージにとどまらず、孫パッケージ、ひ孫パッケージと続くこともあるでしょう。

しかし、パッケージマネージャーであるNuGetを使えば、メンドクサイ依存関係を自動で解決してくれます

とっても便利です。

NuGetの使い方(画面で操作)

visutal studio でC#を開発している場合、使い方は大きく分けて2つ
画面操作(GUI)で操作するか、コマンドラインで操作するかです。
コマンドラインはコマンド自体が複数(PMとかdotnetとか)あるため、ここでは安定の画面操作を紹介します。

NuGet画面の起動

visual sudioのプロジェクトを右クリックして「Nugetパッケージの管理」を選択しパッケージの画面を開きます。

余談ですが、複数のプロジェクトをソリューションで管理している場合はソリューションを右クリックしてNuget管理に進むことができます。
ソリューション単位で開くと、複数のプロジェクトに同時にパッケージインストールやアンインストールできます。

必要なパッケージの検索、パッケージのインストール

参照タブからキーワード検索することで目的のパッケージを探します。
パッケージを選択すると右側にインストールボタンが表示されるので、インストールと押せばOKです。

確認のポップアップがでますが、問題なければOKを押下。
すると必要なパッケージがダウンロード&インストールされます。

パッケージのアンインストール、バージョンアップ、バージョンダウン

インストールが完了すると「インストール済み」からアンインストールやバージョンの更新ができます。

まとめ

以上が、NuGetについてとその使い方でした。参考になれば幸いです。

余談ですけど、発音は new get がネイティブの発音とのことです。
https://haacked.com/archive/2010/10/29/nupack-is-now-nuget.aspx/