Xamarin Studio で、プロジェクトファイル毎に packages.config を変える方法


同一ディレクトリにあるプロジェクトで、それぞれ nuget packages の構成を変えたい場合があります。

デバッグ用とリリース用のプロジェクトを分けていて、デバッグ用にのみ必要な nuget パッケージを使っている、とか。

MyAwesomeApp_debug.csproj    <-- Debugログ収集用の nuget パッケージを使っている
MyAwesomeApp_release.csproj  <-- そんなものは必要ない

ライブラリをデバッグしながらアプリを実行したい場合と、アプリだけで実行したい場合、とか。

MyAwesomeApp.csproj           <-- アプリ単体のプロジェクト(lib は nuget から得る)
MyAwesomeApp_with_lib.csproj  <-- lib をアプリからデバッグしたい時のプロジェクト(lib はプロジェクト参照でソースが提供されるので nuget 要らない)

私がやりたかったのは後者で、 Xamarin.Forms.GoogleMaps のサンプルプロジェクトは、

  • サンプルのみ利用したい人(普通はこっち)は、 XF.GoogleMaps は nuget から読み込ませたい
  • 開発に参加する人は、XF.GoogleMaps はプロジェクト参照で読み込ませたい

という2つのニーズがあります。

通常、 プロジェクトで使用する nuget パッケージは、xxx.csproj と同じディレクトリにある packages.config というファイルで管理されます。

ところが上記のような同じディレクトリ内に複数のプロジェクトがある場合、どちらも packages.config を参照してしまいます。

なにか良い手はないかなーと探していたら、ありました。

どうやらですね、 packages.config は、 packages.プロジェクト名.config というファイル名に変えると、その .csproj のためだけの nuget パッケージ設定ファイルになる模様。

さっそく、サンプルプロジェクトに 適用しました

プロジェクトは XFGoogleMapSample.csprojXFGoogleMapSample.local.csproj があるので、それにあわせて packages.XFGoogleMapSample.configpackages.XFGoogleMapSample.local.config を用意しました。(packages.config は消しました。)

2つのプロジェクトをそれぞれ含む2つのソリューションを開いてみると、

このように、 XFGoogleMapSample.local.csproj の方は、 Xamarin.Forms.GoogleMaps が Packages にないのがわかります。

このように、 packages.[projectname].config とすると、プロジェクト固有の nuget 設定ファイルにすることができます。(このケースでも packages.config が存在しているとそちらが優先されてしまうようです。)

この構成で、 Xamarin Studio、 Visual Studio for Mac, Visual Studio 2015 で問題なく読み込めましたし、 Bitrise という CI サービスでも使えたので、実用には問題なさそうです。