「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>NuGet]] * 目次 [#t4e98973] #contents *NuGet の操作 [#hc9419a9] **GUI での操作 [#i71d56cf] Visual Studio の「NuGet パッケージの管理」画面で操作する。~ [ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGet パッケージの管理] -CUI に比べると、できることが少ない~ インストールできるパッケージは、最新版のみで、バージョンを指定してのインストールはできない -更新ができない~ 一旦アンインストールしたあと、再度最新版をインストールする **CUI での操作 [#lc0bc4fa] Visual Studio の「パッケージ マネージャー コンソール」でコマンドを送信~ [ツール]-[NuGet パッケージ マネージャー]-[パッケージ マネージャー コンソール] ***参考 [#x80329fb] -NuGet で使用できる全コマンド~ https://docs.nuget.org/consume/package-manager-console-powershell-reference ***主なコマンド [#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''~ 指定したパッケージが、別のパッケージから依存されていても、強制的にそのパッケージをアンインストールする。 ***パッケージの更新 [#h4de889b] パッケージの更新 (Update-Package) を行うと、以下の操作が行われる。~ (簡単のため、依存関係は省略している) +プロジェクトから、当該パッケージを削除する ++アセンブリ (*.dll) の場合、参照設定を解除する ++JavaScript や CSS の場合、ファイルそのものを削除する +packages.config から、当該パッケージの項目を削除する +packages フォルダから、古いバージョンのパッケージを削除する +更新後のバージョンのパッケージを、packages フォルダにダウンロードする +packages.config に、更新後のパッケージの項目を追加する +プロジェクトに、更新後のパッケージを追加する ++アセンブリ (*.dll) の場合、参照設定を追加する~ (参照先は、packages フォルダの中) ++JavaScript や CSS の場合、プロジェクトにファイルをコピーする このため、NuGet パッケージについては、この -プロジェクトの参照設定 または プロジェクトに含まれる JavaScript / CSS などのファイル -packages.config -packages フォルダ の整合性を保つため、コマンドを使用して NuGet 経由で管理することを基本とする。~ (これらを手で編集することはオススメしない) *アセンブリ参照先の種類 [#z4db50b1] **GAC (Global Assembly Cache) [#v5e8c35e] GAC に登録されるような従来の[[Microsoft Windows Installer]]で配布されるようなパッケージは、今までどおり GAC に登録されているものを参照する。 **NuGet [#e68ca89b] GAC に登録されていないパッケージ (OSS ライブラリなど) は、もちろん個別にパッケージをダウンロードし、それを参照することもできる。~ しかし、そのパッケージが NuGet に登録されていれば、NuGet のメリットを享受するために NuGet 経由でインストールするのが良いのではないかと思われる。 **それ以外 [#j11c0ae4] GAC にも NuGet にも登録されていないパッケージを使用する場合は、個別にダウンロードし、プロジェクトから参照させる。 **注意事項 [#kcf239d3] ***ローカルコピー [#s66ec541] NuGet でインストールしたパッケージ (*.dll) は、GAC には含まれない。~ このため、NuGet でインストールしたパッケージをアプリケーションで使用する場合、「ローカルコピー」は必ず「True」にしておくこと。 *もし、こんなことをしてしまった場合はどうなる? [#gb2cd424] **手動で、NuGet でインストールしたパッケージの参照設定を解除した [#w94d3bfb] ***ビルド [#r26b308b] -参照設定を解除したパッケージを使用していない場合は、通る。~ -(ただし、参照設定、packages.config、packages フォルダの整合性は崩れたまま) ***Install-Package [#ic394b19] -既にインストールされています。というメッセージが表示され、変わりなし。~ -(ただし、参照設定、packages.config、packages フォルダの整合性は崩れたまま) ***Update-Package [#ucff5796] -当該パッケージに更新がなかった場合 --更新はありません。というメッセージが表示され、変わりなし。 --(参照設定、packages.config、packages フォルダの整合性は崩れたまま) -当該パッケージに更新があった場合 --問題なく更新が行われる。 --''参照設定、packages.config、packages フォルダの整合性も直る。'' ***Uninstall-Package [#o8309b65] -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 によるビルドでも有効)。 ※ [[この動作は、Visual Studio 2015 (NuGet 2.7) で変更されている。>#gc55f443]] ***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 に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。 **[[NuGetパッケージのDL先を変更した>#w8b2cd27]] [#efc7fefa] 同様に参照設定との整合性が崩れる。 -プロジェクトファイル(*.csproj、*.vbproj)内の<HintPath></HintPath>のタグを修正する。 -若しくは、Uninstall-Package -> Install-Packageを行う。 *その他のトピック [#t3cd7fc2] **packageバージョンの変更時の注意事項 [#vcebe7be] NuGetは、Install-Packageを行った際に、バージョン間の問題を解決するために、~ "assemblyBinding -> dependentAssembly -> bindingRedirect" を追加する。 このため、 -Update-Package -Uninstall-Package -> Install-Package によってpackageのバージョンを変更した場合、問題を起こすことがある。 この場合、一度、assemblyBinding sectionを削除した後に、~ Add-BindingRedirectを実行して、bindingRedirectを再生成する。 ***参考 [#j5ffd193] -Updating Assembly Redirects with NuGet - Rick Strahl's Web Log~ https://weblog.west-wind.com/posts/2014/Nov/29/Updating-Assembly-Redirects-with-NuGet -NuGet versioning --Part 1: taking on DLL Hell - David Ebbo~ http://blog.davidebbo.com/2011/01/nuget-versioning-part-1-taking-on-dll.html --Part 2: the core algorithm - David Ebbo~ http://blog.davidebbo.com/2011/01/nuget-versioning-part-2-core-algorithm.html --Part 3: unification via binding redirects - David Ebbo~ http://blog.davidebbo.com/2011/01/nuget-versioning-part-3-unification-via.html -初心者が迷ったNuGet Packageのバージョンを下げたら~ app.configを掃除しなければイケナイという話 - tmori3y2のブログ~ http://tmori3y2.hatenablog.com/entry/2016/02/07/235133 --.nuspec は間違いの無いように書こう、もしくは MSBuild の詳細出力を確認する - kendik.net~ http://kendik.hatenablog.com/entry/2015/01/27/221240 **NuGetパッケージのDL先の変更方法 [#w8b2cd27] -nuget.configを用意し、親ディレクトリに配置、~ ここに、repositoryPathを指定することでNuGetパッケージのDL先を変更できそう。 <?xml version="1.0" encoding="utf-8"?> <configuration> <config> <add key="repositoryPath" value=".\sharedpackages" /> </config> </configuration> -なお、検証の結果、[[ソリューション分割>VSソリューション プロジェクトの構成検討]]によって、~ NuGetパッケージのDL先(packages)が分割される模様。~ (既定では*.slnファイルと同じ階層にpackagesフォルダができる) -従って、このケースでpackagesを共有したい場合、 --2つのソリューションのルート・ディレクトリにnuget.configを配置するか、 --2つのソリューションの其々の上位ディレクトリにnuget.configを配置し、同じrepositoryPathを指すか、 >で、対応ができる。 -以下は、2つの*.slnファイル(ClassLibrary.sln、ConsoleApp1.sln)間でpackagesを共有した例。 フォルダ/ファイル名 種類 ----------------------------------------------------------------------------------------------------- Root1 <Dir> ├ ClassLibrary <Dir> | ├ ClassLibrary1 <Dir> | | ├ Properties <Dir> | | | └ AssemblyInfo.cs <File> | | ├ Class1.cs <File> | | ├ ClassLibrary1.csproj <File> | | └ packages.config <File> | ├ ClassLibrary2 <Dir> | | ├ Properties <Dir> | | | └ AssemblyInfo.cs <File> | | ├ Class1.cs <File> | | ├ ClassLibrary2.csproj <File> | | └ packages.config <File> | └ ClassLibrary.sln <File> ├ ConsoleApp1 <Dir> | ├ ConsoleApp1 <Dir> | | ├ Properties <Dir> | | | └ AssemblyInfo.cs <File> | | ├ App.config <File> | | ├ ConsoleApp1.csproj <File> | | ├ packages.config <File> | | └ Program.cs <File> | └ ConsoleApp1.sln <File> ├ sharedpackages <Dir> | └ Newtonsoft.Json.10.0.3 <Dir> | ├ lib <Dir> | ├ tools <Dir> | ├ LICENSE.md <File> | └ Newtonsoft.Json.10.0.3.nupkg <File> └ nuget.config <File> ***参考 [#pccf7a8d] -.net - NuGetのパッケージの場所を変更することは可能ですか? - visual-studio | CODE Q&A [日本語]~ https://code.i-harness.com/ja/q/3e7357 -複数のソリューション間で NuGet のリポジトリを共有する - しばやん雑記~ http://blog.shibayan.jp/entry/20150417/1429269753 -Configuring the behavior of NuGet~ https://docs.microsoft.com/ja-jp/nuget/consume-packages/configuring-nuget-behavior *マイグレーション [#efb3ee82] **Visual Studio 2015 [#gc55f443] NuGet自体のバージョンを(NuGet 2.7以降に)上げると、リストア方法も変更になる。 この場合、以下のように、リストア方法をマイグレーションする必要がある。 -Issue #220 · OpenTouryoProject/OpenTouryo~ This project references NuGet package(s) that are missing on this computer....~ https://github.com/OpenTouryoProject/OpenTouryo/issues/220 ***参考 [#yf912230] -c# - How do I Enable NuGet Package Restore in Visual Studio 2015 - Stack Overflow~ http://stackoverflow.com/questions/27895504/how-do-i-enable-nuget-package-restore-in-visual-studio-2015 -NuGet 2.7へアップグレードした場合のプロジェクトファイル変更方法(任意) - kkamegawa's weblog~ http://kkamegawa.hatenablog.jp/entry/20130825/p1 -NuGet Package Restore | Microsoft Docs~ https://docs.microsoft.com/ja-jp/nuget/consume-packages/package-restore **Visual Studio 2017 [#kd22a95f] ***PackageReference [#s3c3fcd3] Visual Studio 2017からは、packages.configではなく、~ Projectファイルに統合されたPackageReference を使用できる。 - 新しい csproj 形式 | ++C++; // 未確認飛行 C ブログ~ http://ufcpp.net/blog/2017/5/newcsproj/ - Visual Studio 2017 での NuGet アップデートが良い感じだった - しばやん雑記~ http://blog.shibayan.jp/entry/20170201/1485878757 ***.NET Coreの場合 [#hfdecb5a] -.NET Coreで、ビルド出力にNuGetリファレンスがコピーされない。 --以下をcsprojファイルに追加するとNuGetリファレンスをビルド出力にコピーする。 <PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> --参考 ---c# - How to get .NET Core projects to copy NuGet references to build output? - Stack Overflow~ https://stackoverflow.com/questions/43837638/how-to-get-net-core-projects-to-copy-nuget-references-to-build-output -NuGet Warning NU1701 --netとnetstandardのアセンブリを同梱したNuGetパッケージで、~ netアセンブリ側でnetstandardに対応していないNuGetパッケージを参照していると発生。 --参考 --- *参考サイト [#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 -.NET開発の新標準「NuGet」入門 - @IT --(前編)~ http://www.atmarkit.co.jp/fdotnet/chushin/nuget_01/nuget_01_01.html --(後編)~ http://www.atmarkit.co.jp/fdotnet/chushin/nuget_02/nuget_02_01.html ---- Tags: [[:.NET開発]], [[:デプロイ]], [[:NuGet]]