「[[マイクロソフト系技術情報 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''~
インストール済みのパッケージ一覧を表示する。

-''Get-Package {パッケージ名の一部}''~
--''Get-Package {パッケージ名の一部}''~
インストール済みのパッケージの中で、指定した名前をパッケージ名に含むものの一覧を表示する。

-''Install-Package {パッケージ名}''
--指定したパッケージの、最新バージョンをインストールする。
--指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。
-インストール

-''Install-Package {パッケージ名} -Version {バージョン番号}''
--指定したパッケージの、指定したバージョンをインストールする。
--指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。
--''Install-Package {パッケージ名}''
---指定したパッケージの、最新バージョンをインストールする。
---指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。

-''Install-Package {パッケージ名} -ProjectName {プロジェクト名}''~
--''Install-Package {パッケージ名} -Version {バージョン番号}''
---指定したパッケージの、指定したバージョンをインストールする。
---指定したパッケージが、別のパッケージに依存している場合、そのパッケージもあわせてインストールされる。

--''Install-Package {パッケージ名} -ProjectName {プロジェクト名}''~
指定したパッケージを、指定したプロジェクトにインストールする。

-''Update-Package''~
-アップデート

--''Update-Package''~
現在インストールされているパッケージを、すべて最新版に更新する。

-''Update-Package {パッケージ名}''~
--''Update-Package {パッケージ名}''~
指定したパッケージを、最新バージョンに更新する。

-''Update-Package {パッケージ名} -Version {バージョン番号}''~
--''Update-Package {パッケージ名} -Version {バージョン番号}''~
指定したパッケージを、指定したバージョンに更新する。

-''Uninstall-Package {パッケージ名}''~
-アンインストール

--''Uninstall-Package {パッケージ名}''~
指定したパッケージをアンインストールする。

-''Uninstall-Package {パッケージ名} -RemoveDependencies''~
--''Uninstall-Package {パッケージ名} -RemoveDependencies''~
指定したパッケージが別のパッケージに依存している場合、~
指定したパッケージを削除することによって、依存している別のパッケージがどこからも参照されない状態になるのであれば、~
その依存している別のパッケージもアンインストールする。

-''Uninstall-Package {パッケージ名} -Force''~
--''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]

***注意事項 [#g59195ae]
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]

***変更方法 [#c4e24322]
-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

**[[NuGetでインストールすると依存関係が増えすぎる問題]] [#d3e35b02]

*マイグレーション [#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]

***Package Reference [#s3c3fcd3]
Visual Studio 2017からは、packages.configではなく、~
Projectファイルに統合されたPackage Reference を使用できる。

- 新しい csproj 形式 | ++C++; // 未確認飛行 C ブログ~
http://ufcpp.net/blog/2017/5/newcsproj/
- Visual Studio 2017 での NuGet アップデートが良い感じだった - しばやん雑記~
http://blog.shibayan.jp/entry/20170201/1485878757

ただし、[[一部問題>PackageReferenceに切り替え後のビルドで「error CS0246 The type or namespace name ...」が発生]]を観測している。

***.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からnetcoreappのパッケージを参照した場合などに発生する。 

--netとnetstandardのアセンブリを同梱したNuGetパッケージでは、~
[[dependencies - group - targetFramework>NuGetパッケージの開発と公開#s01937f7]]で解決できる。

--参考
---Several warnings building on .Net Core · Issue #559 · Azure/Azure-Functions~
https://github.com/Azure/Azure-Functions/issues/559

*参考サイト [#ba9f6a73]
-.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

**nuget.org [#cef3dce7]
-NuGet Gallery | Home~
https://www.nuget.org/
>現在登録されている NuGet パッケージを検索可能

-NuGet Docs~
http://docs.nuget.org/
>NuGet の機能や使い方などのドキュメントを閲覧可能 (英語)

**Microsoft Docs [#b9d4f08e]

***ツール [#n583c165]
-NuGet パッケージ マネージャー UI リファレンス~
https://docs.microsoft.com/ja-jp/nuget/tools/package-manager-ui

-NuGet パッケージ マネージャー コンソールのガイド~
https://docs.microsoft.com/ja-jp/nuget/tools/package-manager-console

-NuGet コマンド ライン インターフェイス (CLI) のリファレンス~
https://docs.microsoft.com/ja-jp/nuget/tools/nuget-exe-cli-reference

***PowerShell [#zf381949]
-NuGet の Install-packageの PowerShell リファレンス~
https://docs.microsoft.com/ja-jp/nuget/tools/ps-ref-install-package
-NuGet の Update-packageの PowerShell リファレンス~
https://docs.microsoft.com/ja-jp/nuget/tools/ps-ref-update-package
-NuGet の Uninstall-package PowerShell リファレンス~
https://docs.microsoft.com/ja-jp/nuget/tools/ps-ref-uninstall-package

----
Tags: [[:.NET開発]], [[:デプロイ]], [[:NuGet]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS