NuGet パッケージのインストールのしくみ

分かりやすく言うと、さまざまな NuGet ツールは通常、プロジェクト ファイルまたは packages.config にパッケージへの参照を作成し、次にパッケージの復元を実行することによって効果的にパッケージをインストールします。 ただし nuget install は例外です。この方法では packages フォルダーにパッケージを展開するのみで、その他のファイルは変更しません。

一般的なプロセスは次のようになります。

  1. (nuget.exe を除くすべてのツール) プロジェクト ファイルまたは packages.config に、パッケージ識別子とバージョンを記録します。

    インストール ツールが Visual Studio か dotnet CLI の場合は、このツールは最初にパッケージをインストールしようとします。 互換性がない場合、パッケージはプロジェクト ファイルにも packages.config にも追加されません。

  2. パッケージを取得します。

    • グローバル パッケージとキャッシュ フォルダーの管理」で説明されているように、パッケージが "グローバル パッケージ" フォルダーにインストール済みかどうかを (正確な識別子とバージョン番号によって) チェックします。

    • パッケージがグローバル パッケージ フォルダーにない場合、構成ファイルでリストされているソースからパッケージの取得を試みます。 パッケージ ソース マッピング構成は、この時点で適用されます。 オンライン ソースの場合は、nuget.exe コマンドで -NoHttpCache を指定するか、dotnet restore--no-http-cache を指定しない限り、最初に HTTP キャッシュからパッケージを取得しようと試みます。 (Visual Studio と dotnet add package では常にこのキャッシュを使用します。) パッケージがキャッシュから使用されている場合は、出力に "CACHE" が表示されます。 キャッシュには 30 分の有効期限があります。

    • 最新バージョンを使用して、または最小バージョンなしでパッケージが指定されている場合、NuGet によってすべてのソースに接続され、最適なものが特定 "されます"。 例: 1.*(, 2.0.0]

    • パッケージが HTTP キャッシュにない場合、構成にリストされているソースからパッケージのダウンロードを試みます。 パッケージがダウンロードされると、出力に "GET" および "OK" と表示されます。 NuGet では、通常の詳細度で http トラフィックが記録されます。

    • パッケージがいずれのソースからも正常に取得できない場合は、この時点でインストールが失敗し、NU1103 などのエラーが発生します。 nuget.exe コマンドのエラーでは最後にチェックされたソースのみが表示されますが、実際にはいずれのソースからもパッケージをダウンロードできなかったことを意味しています。

    パッケージを取得するときに、NuGet の構成でのソースの順序が適用される場合があります。

    • NuGet では HTTP ソースをチェックする前に、ローカルのフォルダーとネットワーク共有からソースがチェックされます。
  3. グローバル パッケージとキャッシュ フォルダーの管理」で説明されているように、パッケージのコピーとその他の情報を "HTTP キャッシュ" フォルダーに保存します。

  4. ダウンロードが完了したら、ユーザーごとの "グローバル パッケージ" フォルダーにパッケージをインストールします。 NuGet では、パッケージの識別子ごとにサブフォルダーが作成され、次にインストールされるパッケージのバージョンごとにサブフォルダーが作成されます。

  5. NuGet では、必要に応じて、パッケージの依存関係がインストールされます。 このプロセスでは、依存関係の解決に関するページで説明されているように、パッケージのバージョンが更新される可能性があります。

  6. その他のプロジェクト ファイルとフォルダーを更新します。

    • PackageReference を使用するプロジェクトの場合は、obj/project.assets.json に格納されているパッケージの依存関係グラフを更新します。 パッケージの内容自体はいずれのプロジェクト フォルダーにもコピーされません。
    • パッケージでソースと構成ファイルの変換が使用されている場合は、app.configweb.config を更新します。
  7. (Visual Studio のみ) Visual Studio のウィンドウにパッケージの readme ファイルが表示されます (利用可能な場合)。

それでは NuGet パッケージでの生産性の高いコーディングをお楽しみください。