NuGet パッケージのインストールのしくみ
分かりやすく言うと、さまざまな NuGet ツールは通常、プロジェクト ファイルまたは packages.config
にパッケージへの参照を作成し、次にパッケージの復元を実行することによって効果的にパッケージをインストールします。 ただし nuget install
は例外です。この方法では packages
フォルダーにパッケージを展開するのみで、その他のファイルは変更しません。
一般的なプロセスは次のようになります。
(
nuget.exe
を除くすべてのツール) プロジェクト ファイルまたはpackages.config
に、パッケージ識別子とバージョンを記録します。インストール ツールが Visual Studio か dotnet CLI の場合は、このツールは最初にパッケージをインストールしようとします。 互換性がない場合、パッケージはプロジェクト ファイルにも
packages.config
にも追加されません。パッケージを取得します。
「グローバル パッケージとキャッシュ フォルダーの管理」で説明されているように、パッケージが "グローバル パッケージ" フォルダーにインストール済みかどうかを (正確な識別子とバージョン番号によって) チェックします。
パッケージがグローバル パッケージ フォルダーにない場合、構成ファイルでリストされているソースからパッケージの取得を試みます。 パッケージ ソース マッピング構成は、この時点で適用されます。 オンライン ソースの場合は、
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 ソースをチェックする前に、ローカルのフォルダーとネットワーク共有からソースがチェックされます。
「グローバル パッケージとキャッシュ フォルダーの管理」で説明されているように、パッケージのコピーとその他の情報を "HTTP キャッシュ" フォルダーに保存します。
ダウンロードが完了したら、ユーザーごとの "グローバル パッケージ" フォルダーにパッケージをインストールします。 NuGet では、パッケージの識別子ごとにサブフォルダーが作成され、次にインストールされるパッケージのバージョンごとにサブフォルダーが作成されます。
NuGet では、必要に応じて、パッケージの依存関係がインストールされます。 このプロセスでは、依存関係の解決に関するページで説明されているように、パッケージのバージョンが更新される可能性があります。
その他のプロジェクト ファイルとフォルダーを更新します。
- PackageReference を使用するプロジェクトの場合は、
obj/project.assets.json
に格納されているパッケージの依存関係グラフを更新します。 パッケージの内容自体はいずれのプロジェクト フォルダーにもコピーされません。 - パッケージでソースと構成ファイルの変換が使用されている場合は、
app.config
やweb.config
を更新します。
- PackageReference を使用するプロジェクトの場合は、
(Visual Studio のみ) Visual Studio のウィンドウにパッケージの readme ファイルが表示されます (利用可能な場合)。
それでは NuGet パッケージでの生産性の高いコーディングをお楽しみください。