Open棟梁Project - マイクロソフト系技術情報 Wiki

* 目次 [#t4e98973]
#contents

*NuGet とは [#v8acd5e1]
.NET 向けのパッケージ管理システム。Visual Studio 2010 までで NuGet を使用する場合は、個別に Visual Studio に追加インストールする必要があったが、Visual Studio 2012 以降では、NuGet も Visual Studio に同梱されるようになった。~
[[公式サイト>https://www.nuget.org/]]には、NuGet を使用してインストールできるパッケージ (NuGet パッケージ) が多数公開されている。

*NuGet を使うメリット [#v447cd4b]
-一連のパッケージ管理が簡便になる。
--古いパッケージの参照設定を解除
--古いパッケージを削除
--新しいパッケージに更新
--新しいパッケージを参照設定に追加
-パッケージの依存関係を定義でき、既定では依存関係が壊れるようなパッケージの更新・削除はできず、パッケージ間の関連をキレイに保つことができる。

*NuGet でインストールできる、主なパッケージの種類 [#hff121df]
-.NET アセンブリ (*.dll)
--ASP.NET MVC や、EntityFramework など
-JavaScript や、CSS などのライブラリ
--jQuery や、jQuery の各種プラグインなど

*NuGet で使用するファイル/フォルダ [#t9244c35]
-各プロジェクトに含まれる packages.config~
当該プロジェクトにインストールされている NuGet パッケージが記述される
-ソリューションフォルダ直下の packages フォルダ~
プロジェクトにインストールした NuGet パッケージ本体が格納される

*NuGet の操作 [#hc9419a9]
**GUI での操作 [#i71d56cf]
Visual Studio の「NuGet パッケージの管理」画面で操作する。~
[ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGet パッケージの管理]
-CUI に比べると、できることが少ない~
インストールできるパッケージは、最新版のみで、バージョンを指定してのインストールはできない
-更新ができない~
一旦アンインストールしたあと、再度最新版をインストールする
**CUI での操作 [#lc0bc4fa]
Visual Studio の「パッケージ マネージャー コンソール」でコマンドを送信~
[ツール]-[NuGet パッケージ マネージャー]-[パッケージ マネージャー コンソール]
***主なコマンド [#se78892d]
-''Get-Package''~
インストール済みのパッケージ一覧を表示する。
-''Get-Package {パッケージ名の一部}''~
インストール済みのパッケージの中で、指定した名前をパッケージ名に含むものの一覧を表示する。
-''Install-Package {パッケージ名}''~
指定したパッケージの、最新バージョンをインストールする。~
指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。
-''Install-Package {パッケージ名} -Version {バージョン番号}''~
指定したパッケージの、指定したバージョンをインストールする。~
指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。
-''Install-Package {パッケージ名} -ProjectName {プロジェクト名}''~
指定したパッケージを、指定したプロジェクトにインストールする。
-''Update-Package''~
現在インストールされているパッケージを、すべて最新版に更新する。
-''Update-Package {パッケージ名}''~
指定したパッケージを、最新バージョンに更新する。
-''Update-Package {パッケージ名} -Version''~
指定したパッケージを、指定したバージョンに更新する。
-''Uninstall-Package {パッケージ名}''~
指定したパッケージをアンインストールする。
-''Uninstall-Package {パッケージ名} -RemoveDependencies''~
指定したパッケージが別のパッケージに依存している場合、指定したパッケージを削除することによって、依存している別のパッケージがどこからも参照されない状態になるのであれば、その依存している別のパッケージもアンインストールする。
-''Uninstall-Package {パッケージ名} -Force''~
指定したパッケージが、別のパッケージから依存されていても、強制的にそのパッケージをアンインストールする。

 (参考)NuGet で使用できる全コマンド
 https://docs.nuget.org/consume/package-manager-console-powershell-reference

例えば、パッケージの更新 (Update-Package) を行うと、以下の操作が行われる。~
(簡単のため、依存関係は省略している)
+プロジェクトから、当該パッケージを削除する
++アセンブリ (*.dll) の場合、参照設定を解除する
++JavaScript や CSS の場合、ファイルそのものを削除する
+packages.config から、当該パッケージの項目を削除する
+packages フォルダから、古いバージョンのパッケージを削除する
+更新後のバージョンのパッケージを、packages フォルダにダウンロードする
+packages.config に、更新後のパッケージの項目を追加する
+プロジェクトに、更新後のパッケージを追加する
++アセンブリ (*.dll) の場合、参照設定を追加する~
(参照先は、packages フォルダの中)
++JavaScript や CSS の場合、プロジェクトにファイルをコピーする

このため、NuGet パッケージについては、この
-プロジェクトの参照設定 または プロジェクトに含まれる JavaScript / CSS などのファイル
-packages.config
-packages フォルダ

の整合性を保つため、コマンドを使用して NuGet 経由で管理することを基本とする。~
(これらを手で編集することはオススメしない)

*もし、こんなことをしてしまった場合はどうなる? [#gb2cd424]
**手動で、NuGet でインストールしたパッケージの参照設定を解除した [#w94d3bfb]
-ビルド~
参照設定を解除したパッケージを使用していない場合は、通る。~
(ただし、整合性は崩れたまま)
-Install-Package~
既にインストールされています。というメッセージが表示され、変わりなし。~
(ただし、整合性は崩れたまま)
-Update-Package~
--当該パッケージに更新がなかった場合~
更新はありません。というメッセージが表示され、変わりなし。~
(整合性は崩れたまま)
--当該パッケージに更新があった場合~
問題なく更新が行われる。~
''参照設定、packages.config、packages フォルダの整合性もなおる。''
-Uninstall-Package~
packages.config からは削除されるが、packages フォルダから削除する際に、正常に削除できなかった旨の警告が出る。~
Visual Studio を再起動し、プロジェクトを再度開くと、そのときにpackages フォルダからパッケージが削除される。~
''参照設定、packages.config、packages フォルダの整合性もなおる。''

**packages フォルダから、手動でフォルダを消した [#tfed94fd]
消したパッケージが自動的に復元され、ビルドは正常終了する。パッケージの復元は、Visual Studio や、MSBuild でビルドした際、足りないパッケージを自動的に NuGet サイトからダウンロードする機能である。
***パッケージの復元を行うための設定 [#d9bd7f1a]
-Visual Studio の [ツール]-[オプション] でオプション画面を開く。
-ツリーの中から、[NuGet パッケージ マネージャー]-[全般] を選択する。
-「足りないパッケージをダウンロードすることを NuGet に許可」にチェックを入れる。

さらに、MSBuild などのコマンドラインツールでのビルド時に、足りないパッケージをダウンロードするには、以下の設定を行う。
-Visual Studio の [ソリューション エクスプローラー] を右クリックし、「Enable NuGet Package Restore」を選択する。

これにより、ソリューションフォルダ直下に''「.nuget」''フォルダができ、コマンドラインツールでのビルド時でも、足りないパッケージがあれば、ダウンロードしてくれる。~
(MSBuild だけでなく、devenv によるビルドでも有効)

**packages フォルダそのものを削除した [#j77fe639]
上記と同様、パッケージが復元され、ビルドは正常終了する。

**packages.config を手動で編集した [#c45e67a1]
***<package> タグを消した [#k9bfa872]
-Install-Package~
成功 (ふたたび packages.config に <package> が生成される)
-Update-Package~
失敗 (パッケージがインストールされていないとのメッセージが表示される)
-Uninstall-Package~
警告 (packages フォルダから削除する際に、正常に削除できなかった旨の警告が出る。Visual Studio を再起動し、プロジェクトを再度開くと、そのときに packages フォルダからパッケージが削除される)

***バージョン番号を編集した [#la20a21a]
-存在するバージョン番号の場合~
ビルドは成功し、編集したバージョン番号のパッケージが packages フォルダに格納される。~
このとき、編集前のバージョンのパッケージは packages フォルダからは削除されない。~
このため、以下の不整合が起きる。
--packages フォルダに、バージョンの異なる 2 つのパッケージが混在する。
--参照設定も解除されないので、プロジェクトは編集前のバージョンのパッケージを参照し続ける。
--このため、packages.config に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。
-存在しないバージョン番号の場合
「NuGet パッケージの復元がプロジェクト {プロジェクト名} に対して失敗しました」というメッセージは表示されるが、ビルド自体は成功する。
(編集前のバージョン番号のパッケージの削除が行われないため。)~
この場合も、以下の不整合が起きる。
--packages フォルダには、編集前のバージョン番号のパッケージのみが残る。
--参照設定も解除されないので、プロジェクトは編集前のバージョンのパッケージを参照し続ける。
--このため、packages.config に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。

*アセンブリ参照先の種類 [#z4db50b1]
-GAC (Global Assembly Cache)~
GAC に登録されているようなパッケージは、今までどおり GAC に登録されているものを参照する。
-NuGet~
GAC に登録されていないパッケージ (OSS ライブラリなど) は、もちろん個別にパッケージをダウンロードし、それを参照することもできる。しかし、そのパッケージが NuGet に登録されていれば、NuGet のメリットを享受するために NuGet 経由でインストールするのが良いのではないかと思われる。
-それ以外~
GAC にも NuGet にも登録されていないパッケージを使用する場合は、個別にダウンロードし、プロジェクトから参照させる。

*注意事項 [#kcf239d3]
NuGet でインストールしたパッケージ (*.dll) は、GAC には含まれない。~
このため、NuGet でインストールしたパッケージをアプリケーションで使用する場合、「ローカルコピー」は必ず「True」にしておくこと。

*参考サイト [#ba9f6a73]
-NuGet Gallery | Home~
https://www.nuget.org/
--現在登録されている NuGet パッケージを検索可能
-NuGet Docs~
http://docs.nuget.org/
--NuGet の機能や使い方などのドキュメントを閲覧可能 (英語)
-.NET 用パッケージマネージャー NuGet のインストールと使い方~
http://yohshiy.blog.fc2.com/blog-entry-236.html

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS