NuGetグローバルパッケージキャッシュの場所を変更する


はじめに

今や.NET系言語を開発するのに必需品となったNuGetだが、気が付くとパッケージキャッシュフォルダが数~数十GB溜まってしまう。
パッケージキャッシュフォルダは MSのドキュメントによると、デフォルトは%userprofile%\.nuget\packages(win)、あるいは$HOME/.nuget/packages(mac,linux)とのことで、気が付くとシステムドライブがまずいことになってたりすることもある。

対処療法的にはdotnet nuget locals global-packages -cで定期的にクリアすればいい話だが、他の選択肢として、他のディレクトリにキャッシュフォルダを逃がすという手がある。この記事では、他のディレクトリをキャッシュフォルダに指定する方法を書きたいと思う。

また、CI/CDサーバーでコンテナ等を使用してビルドする場合にも、キャッシュディレクトリを指定することによって、他のコンテナと領域を共有してビルド速度の短縮を図ったり(競合に気を付ける必要はあるが)、あるいはメモリディスク領域を指定することによって、IO負荷を減らす等の用途にも使用できる。ただし、nugetパッケージ領域は割と大きくなる場合があるので、注意は必要。最低でも1Gは見積もった方が良い

実は、容量ということならばhttp-cache領域も結構あったりする場合もあるが、こちらは環境変数NUGET_HTTP_CACHE_PATHのみ受け付ける仕様で、増加量もグローバルパッケージキャッシュよりも緩やかなため、今回は説明しない。

変更方法

環境変数

環境変数にNUGET_PACKAGESで、フォルダを指定する。スクリプトで実行するならば、他にも影響を与えないため有効な方法だと思う。また、ファイル書き込みを行わないため、CI/CDとも相性が良い。
ただし、指定し忘れるとデフォルトの領域を使用するため、却ってキャッシュフォルダが散在することになり非効率になってしまうので注意が必要。

構成ファイルでの指定

NuGet.configファイルに設定を追加する方式。NuGet.configの場所は、MS公式ドキュメントに記載がある。ユーザーグローバルに設定を反映させたい場合、%appdata%\NuGet\NuGet.config(win)または$HOME/.config/NuGet/NuGet.config(mac,linux)を編集する。
プロジェクトローカルの場合、プロジェクトルート(大体slnの隣)にNuGet.configファイルを作成して編集する。雛形が必要な場合、dotnet new nugetconfigで作成可能。
旧packages.config方式の場合はrepositoryPath、新方式(3.x以降)は、globalPackagesFolderを使用する。
.net coreの開発ならば、globalPackagesFolderの方の指定のみで良い。

あるいは、nuget本サイトのダウンロードページから、nuget.exeをダウンロード(monoの場合は同梱されてるのでそちらでも可)して、nuget.exe config -set globalPackagesFolder=[キャッシュディレクトリ] -configfile [NuGet.configファイルへのパス]というようにしても変更が可能。-configfileは省略可能で、省略した場合はユーザーグローバルのNuGet.configが指定される。

設定例

NuGet.configの中身は、以下のようになる。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <config>
    <add key="globalPackagesFolder" value="c:\bin\nuget-packages" />
  </config>
</configuration>

上記のように設定すると、c:\bin\nuget-packagesフォルダにキャッシュファイルが格納されるようになる(ない場合はディレクトリが作成される)。
ユーザーグローバルの場合は絶対パスのみ許容され、プロジェクトローカルの場合は相対パスも許容される。相対パスを指定した場合は、NuGet.configからの相対パスが適用される。

終りに

自分の場合はシステムドライブの容量圧迫回避のため変更しているが、初回ビルド時等には結構効いてくるところなので、ビルド速度アップの目的で検討してもいいかもしれない。

参考リンク