パッケージをインストール、更新、または復元するたびに、NuGet はプロジェクト構造の外部にある複数のフォルダーでパッケージとパッケージ情報を管理します。
| 名前 | ロケーション |
|---|---|
| global-packages |
|
| http-cache |
|
| 一時 | %temp%\NuGetScratch/tmp/NuGetScratch/tmp/NuGetScratch<username> |
| plugins-cache4.8 以降 |
|
注
NuGet 3.5 以前では、にある http キャッシュの代わりに%localappdata%\NuGet\Cache キャッシュが使用されます。
キャッシュ フォルダーと グローバル パッケージ フォルダーを使用することで、NuGet は通常、コンピューターに既に存在するパッケージのダウンロードを回避し、インストール、更新、および復元操作のパフォーマンスを向上させます。 PackageReference を使用する場合、 グローバル パッケージ フォルダーは、ダウンロードしたパッケージをプロジェクト フォルダー内に保持することを回避し、ソース管理に誤って追加される可能性があり、NuGet のコンピューター ストレージへの全体的な影響を軽減します。
パッケージの取得を求められた場合、NuGet はまず グローバル パッケージ フォルダーを検索します。 パッケージの正確なバージョンがない場合、NuGet は HTTP 以外のすべてのパッケージ ソースをチェックします。 パッケージがまだ見つからない場合は、 コマンドで--no-http-cacheを指定するか、dotnet.exe コマンドで-NoHttpCacheしない限り、NuGet は nuget.exe内のパッケージを検索します。 パッケージがキャッシュにない場合、またはキャッシュが使用されていない場合、NuGet は HTTP 経由でパッケージを取得します。
詳細については、「パッケージの インストール時の動作」を参照してください。
グローバルパッケージ
グローバル パッケージ フォルダーは、NuGet がダウンロードしたパッケージをインストールする場所です。
各パッケージは、パッケージ識別子とバージョン番号に一致するサブフォルダーに完全に展開されます。
PackageReference 形式を使用するプロジェクトでは、常にこのフォルダーから直接パッケージが使用されます。
packages.configを使用すると、パッケージがグローバル パッケージ フォルダーにインストールされ、プロジェクトの packages フォルダーにコピーされます。
グローバル パッケージ ディレクトリのクリーニング
使用されなくなったパッケージを削除するには、グローバル パッケージ ディレクトリを手動でクリーンアップする必要があります。
これを行うには、 dotnet nuget locals global-packages --clean コマンドを使用するか、Visual Studio のオプションの [NuGet ローカル リソースのクリア] ボタン ( dotnet nuget locals all --clearと同じです)。
グローバル パッケージ ディレクトリをクリアした後、プロジェクトをもう一度復元して、必要なすべてのパッケージを再ダウンロードする必要があります。
Visual Studio では、NuGet の "最新の復元" キャッシュをクリアするためにソリューションを再読み込みする必要がある場合や、コマンド ラインの復元 (Visual Studio のターミナル ウィンドウ内など) を msbuild -t:restore your.slnで行う必要がある場合があります。
未使用のパッケージのみをクリーンアップするには、2 つの手順を実行します。
最初に、有効にする必要がある nuget.config 設定 updatePackageLastAccessTime があります。
この設定により、NuGet は復元で使用されるときに、各パッケージの .nupkg.metadata ファイルを更新します。
復元が実行されていても、プロジェクトが既に最新の状態と見なされている場合、パッケージのタイムスタンプは更新 されません 。
.nupkg.metadata ファイルは、復元またはインストール中にパッケージをダウンロードおよび抽出するときに NuGet が作成する最後のファイルであり、パッケージが正常に抽出されたかどうかを確認するために復元で使用されるファイルです。
次に、ツールを実行してクリーンアップを実行します。
updatePackageLastAccessTime設定を有効にした後、定期的に使用するすべてのパッケージのタイムスタンプが更新されていることを確認するために、数日待つことをお勧めします。
現時点では、NuGet にはこれを行うツールやコマンドは用意されていません。 この GitHub の問題に👍の反応を追加して、関心を示すことができます。 一部のコミュニティ メンバーは、検索できる独自のオープン ソースの NuGet クリーナー ツールを作成しています。
独自のクリーンアップ ツールを作成する場合は、他のパッケージ ファイルのいずれかが削除された場合に .nupkg.metadata ファイルを削除することが重要であるため、最初にこのファイルを削除することをお勧めします。
そうしないと、パッケージを参照するプロジェクトが予期しない動作をする可能性があります。
.NET でクリーンアップ ツールを記述する場合は、ConcurrencyUtilities.ExecuteWithFileLocked[Async](..)からを使用し、削除するパッケージ ディレクトリの完全な nupkg パスをキーとして渡すことを検討してください。復元で同時に抽出しようとしているパッケージが削除されないようにします。
グローバル パッケージ ディレクトリは、 NuGet.Configuration パッケージを使用してプログラムで見つけることができます。
Settings.LoadDefaultSettings(path)を使用してISettings インスタンスを取得し (パスとしてnull渡すか、グローバル パッケージ ディレクトリをリダイレクトする nuget.config を使用してソリューションを処理する場合はディレクトリを渡すことができます)、SettingsUtility.GetGlobalPackagesFolder(settings)を使用します。
または、 dotnet nuget locals global-packages --list を子プロセスとして実行し、出力を解析することもできます。
HTTPキャッシュ
NuGet は、ほとんどの NuGet フィード通信 (検索を除く) のコピーを各パッケージ ソースのサブフォルダーに整理してキャッシュします。 パッケージは展開されず、最終更新日が 30 分を超えるファイルは通常、期限切れと見なされます。
一時 (for temporary context) 臨時の労働者 or 派遣労働者 (for temporary worker context)
NuGet がさまざまな操作中に一時ファイルを格納できるフォルダー。
プラグインキャッシュ
NuGet が操作要求要求の結果を格納するフォルダー。 詳細については、 クロスプラットフォームプラグインリファレンス を参照してください。
フォルダーの場所の表示
nuget locals コマンドを使用して場所を表示できます。
# Display locals for all folders: global-packages, http cache, temp and plugins cache
nuget locals all -list
一般的な出力 (Windows;"user1" は現在のユーザー名です。
http-cache: C:\Users\user1\AppData\Local\NuGet\v3-cache
global-packages: C:\Users\user1\.nuget\packages\
temp: C:\Users\user1\AppData\Local\Temp\NuGetScratch
plugins-cache: C:\Users\user1\AppData\Local\NuGet\plugins-cache
(package-cache は NuGet 2.x で使用され、NuGet 3.5 以前で表示されます)。
dotnet nuget locals コマンドを使用して、フォルダーの場所を表示することもできます。
dotnet nuget locals all --list
一般的な出力 (Mac;"user1" は現在のユーザー名です。
info : http-cache: /home/user1/.local/share/NuGet/v3-cache
info : global-packages: /home/user1/.nuget/packages/
info : temp: /tmp/NuGetScratch
info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
一般的な出力 (Linux;"user1" は現在のユーザー名です。
info : http-cache: /home/user1/.local/share/NuGet/v3-cache
info : global-packages: /home/user1/.nuget/packages/
info : temp: /tmp/NuGetScratchuser1
info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
1 つのフォルダーの場所を表示するには、http-cacheではなく、global-packages、temp、plugins-cache、またはallを使用します。
ローカル フォルダーのクリア
Command-line
パッケージのインストールの問題が発生した場合、またはリモート ギャラリーからパッケージをインストールする場合は、 locals --clear オプション (dotnet.exe) または locals -clear (nuget.exe) を使用するか、クリアするフォルダーを指定するか、 all を使用してすべてのフォルダーをクリアします。
# Clear the 3.x+ cache (use either command)
dotnet nuget locals http-cache --clear
nuget locals http-cache -clear
# Clear the 2.x cache (NuGet CLI 3.5 and earlier only)
nuget locals packages-cache -clear
# Clear the global packages folder (use either command)
dotnet nuget locals global-packages --clear
nuget locals global-packages -clear
# Clear the temporary cache (use either command)
dotnet nuget locals temp --clear
nuget locals temp -clear
# Clear the plugins cache (use either command)
dotnet nuget locals plugins-cache --clear
nuget locals plugins-cache -clear
# Clear all caches (use either command)
dotnet nuget locals all --clear
nuget locals all -clear
Visual Studio で現在開いているプロジェクトで使用されているパッケージは、 グローバル パッケージ フォルダーからクリアされません。
Visual Studio
Visual Studio では、[ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャーの設定] メニュー コマンドにある [NuGet パッケージ マネージャー] オプション内のすべてのローカル フォルダーのクリアがサポートされています。
[全般] ページで、[ NuGet ローカル リソースのクリア] を選択します。 一度開始すると、このアクションを取り消すことはできません。 進行状況バーが表示され、コマンドの最終的な状態が表示されます。
[パッケージ マネージャー] から [ 出力 の表示] を選択すると、エラー メッセージなど、clear コマンドに関する追加の詳細が表示されます。
NuGet ローカル リソースのクリア
現在、キャッシュの管理はパッケージ マネージャー コンソールでは使用できません。
詳細については、「 Visual Studio の NuGet オプション」を参照してください。
エラーのトラブルシューティング
nuget localsまたはdotnet nuget localsを使用すると、次のエラーが発生する可能性があります。
エラー: プロセスが別のプロセスで使用されているため、またはローカル リソースのクリアに失敗したため<プロセスがファイル >package にアクセスできません:1 つ以上のファイルを削除できません
フォルダー内の 1 つ以上のファイルが別のプロセスで使用されています。たとえば、 グローバル パッケージ フォルダー内のパッケージを参照する Visual Studio プロジェクトが開いています。 これらのプロセスを閉じて、もう一度やり直してください。
エラー: パス <path へのアクセス> が拒否されたか 、 ディレクトリが空ではありません
キャッシュ内のファイルを削除するアクセス許可がありません。 可能であれば、フォルダーのアクセス許可を変更して、もう一度やり直してください。 それ以外の場合は、システム管理者に問い合わせてください。
エラー: 指定されたパス、ファイル名、またはその両方が長すぎます。 完全に記述されたファイル名は 260 文字未満である必要があり、ディレクトリ名は 248 文字未満である必要があります。
フォルダー名を短くして、やり直してください。