「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
GUI での操作 †
Visual Studio の「NuGet パッケージの管理」画面で操作する。
[ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGet パッケージの管理]
- CUI に比べると、できることが少ない
インストールできるパッケージは、最新版のみで、バージョンを指定してのインストールはできない
- 更新ができない
一旦アンインストールしたあと、再度最新版をインストールする
CUI での操作 †
Visual Studio の「パッケージ マネージャー コンソール」でコマンドを送信
[ツール]-[NuGet パッケージ マネージャー]-[パッケージ マネージャー コンソール]
参考 †
主なコマンド †
- 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
指定したパッケージが、別のパッケージから依存されていても、強制的にそのパッケージをアンインストールする。
パッケージの更新 †
パッケージの更新 (Update-Package) を行うと、以下の操作が行われる。
(簡単のため、依存関係は省略している)
- プロジェクトから、当該パッケージを削除する
- アセンブリ (*.dll) の場合、参照設定を解除する
- JavaScript や CSS の場合、ファイルそのものを削除する
- packages.config から、当該パッケージの項目を削除する
- packages フォルダから、古いバージョンのパッケージを削除する
- 更新後のバージョンのパッケージを、packages フォルダにダウンロードする
- packages.config に、更新後のパッケージの項目を追加する
- プロジェクトに、更新後のパッケージを追加する
- アセンブリ (*.dll) の場合、参照設定を追加する
(参照先は、packages フォルダの中)
- JavaScript や CSS の場合、プロジェクトにファイルをコピーする
このため、NuGet パッケージについては、この
- プロジェクトの参照設定 または プロジェクトに含まれる JavaScript / CSS などのファイル
- packages.config
- packages フォルダ
の整合性を保つため、コマンドを使用して NuGet 経由で管理することを基本とする。
(これらを手で編集することはオススメしない)
アセンブリ参照先の種類 †
GAC (Global Assembly Cache) †
GAC に登録されるような従来のMicrosoft Windows Installerで配布されるようなパッケージは、今までどおり GAC に登録されているものを参照する。
GAC に登録されていないパッケージ (OSS ライブラリなど) は、もちろん個別にパッケージをダウンロードし、それを参照することもできる。
しかし、そのパッケージが NuGet に登録されていれば、NuGet のメリットを享受するために NuGet 経由でインストールするのが良いのではないかと思われる。
それ以外 †
GAC にも NuGet にも登録されていないパッケージを使用する場合は、個別にダウンロードし、プロジェクトから参照させる。
注意事項 †
ローカルコピー †
NuGet でインストールしたパッケージ (*.dll) は、GAC には含まれない。
このため、NuGet でインストールしたパッケージをアプリケーションで使用する場合、「ローカルコピー」は必ず「True」にしておくこと。
もし、こんなことをしてしまった場合はどうなる? †
手動で、NuGet でインストールしたパッケージの参照設定を解除した †
ビルド †
- 参照設定を解除したパッケージを使用していない場合は、通る。
- (ただし、参照設定、packages.config、packages フォルダの整合性は崩れたまま)
Install-Package †
- 既にインストールされています。というメッセージが表示され、変わりなし。
- (ただし、参照設定、packages.config、packages フォルダの整合性は崩れたまま)
Update-Package †
- 当該パッケージに更新がなかった場合
- 更新はありません。というメッセージが表示され、変わりなし。
- (参照設定、packages.config、packages フォルダの整合性は崩れたまま)
- 当該パッケージに更新があった場合
- 問題なく更新が行われる。
- 参照設定、packages.config、packages フォルダの整合性も直る。
Uninstall-Package †
- packages.config からは削除されるが、packages フォルダから削除する際に、正常に削除できなかった旨の警告が出る。
- Visual Studio を再起動し、プロジェクトを再度開くと、そのときにpackages フォルダからパッケージが削除される。
- 参照設定、packages.config、packages フォルダの整合性も直る。
packages フォルダから、手動でフォルダを消した †
消したパッケージが自動的に復元され、ビルドは正常終了する。
パッケージの復元は、Visual Studio や、MSBuild でビルドした際、
足りないパッケージを自動的に NuGet サイトからダウンロードする機能である。
パッケージの復元を行うための設定 †
- Visual Studio の [ツール]-[オプション] でオプション画面を開く。
- ツリーの中から、[NuGet パッケージ マネージャー]-[全般] を選択する。
- 「足りないパッケージをダウンロードすることを NuGet に許可」にチェックを入れる。
さらに、MSBuild などのコマンドラインツールでのビルド時に、足りないパッケージをダウンロードするには、以下の設定を行う。
- Visual Studio の [ソリューション エクスプローラー] を右クリックし、「Enable NuGet Package Restore」を選択する。
これにより、ソリューションフォルダ直下に「.nuget」フォルダができ、
コマンドラインツールでのビルド時でも、足りないパッケージがあれば、
ダウンロードしてくれる(MSBuild だけでなく、devenv によるビルドでも有効)。
※ この動作は、Visual Studio 2015 (NuGet 2.7) で変更されている。
packages フォルダそのものを削除した †
上記と同様、パッケージが復元され、ビルドは正常終了する。
packages.config を手動で編集した †
<package> タグを消した †
- Install-Package
成功 (ふたたび packages.config に <package> が生成される)
- Update-Package
失敗 (パッケージがインストールされていないとのメッセージが表示される)
- Uninstall-Package
警告 (packages フォルダから削除する際に、正常に削除できなかった旨の警告が出る。
Visual Studio を再起動し、プロジェクトを再度開くと、そのときに packages フォルダからパッケージが削除される)
バージョン番号を編集した †
- 存在するバージョン番号の場合
ビルドは成功し、編集したバージョン番号のパッケージが packages フォルダに格納される。
このとき、編集前のバージョンのパッケージは packages フォルダからは削除されない。
このため、以下の不整合が起きる。
- packages フォルダに、バージョンの異なる 2 つのパッケージが混在する。
- 参照設定も解除されないので、プロジェクトは編集前のバージョンのパッケージを参照し続ける。
- このため、packages.config に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。
- 存在しないバージョン番号の場合
「NuGet パッケージの復元がプロジェクト {プロジェクト名} に対して失敗しました」というメッセージは表示されるが、
- ビルド自体は成功する(編集前のバージョン番号のパッケージの削除が行われないため。)。
- この場合も、以下の不整合が起きる。
- packages フォルダには、編集前のバージョン番号のパッケージのみが残る。
- 参照設定も解除されないので、プロジェクトは編集前のバージョンのパッケージを参照し続ける。
- このため、packages.config に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。
同様に参照設定との整合性が崩れる。
- プロジェクトファイル(*.csproj、*.vbproj)内の<HintPath?></HintPath?>のタグを修正する。
- 若しくは、Uninstall-Package -> Install-Packageを行う。
その他のトピック †
packageバージョンの変更時の注意事項 †
NuGetは、Install-Packageを行った際に、バージョン間の問題を解決するために、
"assemblyBinding -> dependentAssembly -> bindingRedirect" を追加する。
このため、
- Update-Package
- Uninstall-Package -> Install-Package
によってpackageのバージョンを変更した場合、問題を起こすことがある。
この場合、一度、assemblyBinding sectionを削除した後に、
Add-BindingRedirect?を実行して、bindingRedirectを再生成する。
参考 †
NuGetパッケージのDL先の変更方法 †
- なお、検証の結果、ソリューション分割によって、
NuGetパッケージのDL先(packages)が分割される模様。
(既定では*.slnファイルと同じ階層にpackagesフォルダができる)
- 従って、このケースでpackagesを共有したい場合、
- 2つのソリューションのルート・ディレクトリにnuget.configを配置するか、
- 2つのソリューションの其々の上位ディレクトリにnuget.configを配置し、同じrepositoryPathを指すか、
で、対応ができる。
参考 †
マイグレーション †
Visual Studio 2015 †
NuGet自体のバージョンを(NuGet 2.7以降に)上げると、リストア方法も変更になる。
この場合、以下のように、リストア方法をマイグレーションする必要がある。
参考 †
Visual Studio 2017 †
PackageReference? †
Visual Studio 2017からは、packages.configではなく、
Projectファイルに統合されたPackageReference? を使用できる。
.NET Coreの場合 †
- .NET Coreで、ビルド出力にNuGetリファレンスがコピーされない。
- netとnetstandardのアセンブリを同梱したNuGetパッケージで、
netアセンブリ側でnetstandardに対応していないNuGetパッケージを参照していると発生。
参考サイト †
- .NET開発の新標準「NuGet」入門 - @IT
Tags: :.NET開発, :デプロイ, :NuGet