しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

複数のソリューション間で NuGet のリポジトリを共有する

最近はソリューションを分割して別々に開発する機会が多いのですが、毎回 NuGet パッケージの復元で困るので、ソリューションが分割されていても NuGet パッケージのリポジトリを共有する方法を調べました。

前提としては、以下のようなソリューション構成になっています。

ClassLibrary1 は別々に見えますが、実態は同じものを指しています。

WebApplication1 は既存のプロジェクトをソリューションに追加した後に、参照するようにしています。

この時、両方のソリューションでパッケージをインストール済みなら問題無いですが、Git から持ってきた場合などリポジトリが存在しない場合に、アセンブリを参照できないという警告が出ます。

パッケージはインストールされますが、csproj に書いてある HintPath が存在していないリポジトリを指しているので、このような警告が表示されます。

なのでパッケージのリポジトリをソリューション間で共有すれば解決します。NuGet.config で repositoryPath を相対パスで設定しておけば、そのパスが使われます。

Common NuGet configurations | Microsoft Learn

sharedpackages というディレクトリをリポジトリにする設定は以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value=".\sharedpackages" />
  </config>
</configuration>

この内容で NuGet.config ファイルを作成し、ソリューションより上の階層に置いておきます。

リビルドなどでは参照の設定が変わらないので、パッケージ自体をもう一度インストールしなおす必要がありますが、これで別々のソリューションでも同じリポジトリを参照するようになります。

設定した sharedpackages に全てのパッケージがインストールされていることが確認出来ます。

NuGet.config ファイルはソリューションを作成する前に置いておくのが良さそうです。

追記

おーみさんから NuGet.config を置く場所に付いて突っ込まれたので追記します。

NuGet.config を探す処理が NuGet 2.1 で変更されていて、プロジェクトのディレクトリからそのドライブのルートまで再帰的に辿るようになっています。

NuGet.config files are searched for in the following order:
1..nuget\nuget.config
2.Recursive walk from project folder to root
3.Global nuget.config (%appdata%\NuGet\nuget.config)

https://docs.nuget.org/Release-Notes/NuGet-2.1

なので、プロジェクトに含める必要はなく、共通の親ディレクトリに置いておけば動作するという訳です。