マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

NuGet の操作

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) を行うと、以下の操作が行われる。
(簡単のため、依存関係は省略している)

  1. プロジェクトから、当該パッケージを削除する
    1. アセンブリ (*.dll) の場合、参照設定を解除する
    2. JavaScript や CSS の場合、ファイルそのものを削除する
  2. packages.config から、当該パッケージの項目を削除する
  3. packages フォルダから、古いバージョンのパッケージを削除する
  4. 更新後のバージョンのパッケージを、packages フォルダにダウンロードする
  5. packages.config に、更新後のパッケージの項目を追加する
  6. プロジェクトに、更新後のパッケージを追加する
    1. アセンブリ (*.dll) の場合、参照設定を追加する
      (参照先は、packages フォルダの中)
    2. JavaScript や CSS の場合、プロジェクトにファイルをコピーする

このため、NuGet パッケージについては、この

  • プロジェクトの参照設定 または プロジェクトに含まれる JavaScript / CSS などのファイル
  • packages.config
  • packages フォルダ

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

アセンブリ参照先の種類

GAC (Global Assembly Cache)

GAC に登録されるような従来のMicrosoft Windows Installerで配布されるようなパッケージは、今までどおり GAC に登録されているものを参照する。

NuGet

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 に書かれたバージョン番号と、実際に参照しているバージョン番号が一致しないことになる。

NuGetパッケージのDL先を変更した

同様に参照設定との整合性が崩れる。

  • プロジェクトファイル(*.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.configを用意し、親ディレクトリに配置、
    ここに、repositoryPathを指定することでNuGetパッケージのDL先を変更できそう。
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <config>
        <add key="repositoryPath" value=".\sharedpackages" />
      </config>
    </configuration>
  • なお、検証の結果、ソリューション分割によって、
    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>   

参考

マイグレーション

Visual Studio 2015

NuGet自体のバージョンを(NuGet 2.7以降に)上げると、リストア方法も変更になる。

この場合、以下のように、リストア方法をマイグレーションする必要がある。

参考

Visual Studio 2017

PackageReference?

Visual Studio 2017からは、packages.configではなく、
Projectファイルに統合されたPackageReference? を使用できる。

.NET Coreの場合

  • .NET Coreで、ビルド出力にNuGetリファレンスがコピーされない。
  • 以下をcsprojファイルに追加するとNuGetリファレンスをビルド出力にコピーする。
    <PropertyGroup>
      <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    </PropertyGroup>
  • netとnetstandardのアセンブリを同梱したNuGetパッケージで、
    netアセンブリ側でnetstandardに対応していないNuGetパッケージを参照していると発生。

参考サイト


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-19 (水) 12:17:53 (1d)