kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

NuGet 2.7へアップグレードした場合のプロジェクトファイル変更方法(任意)

NuGet 2.7で改善されるTFSサーバービルド - 新日々此何有哉
昨日の投稿は「NuGet 2.7環境で新規にソリューションを作った場合」の話です。ではNuGet 2.6以前のバージョンで作ったソリューション(プロジェクト)ファイルはどうでしょうか?
TFSサーバービルド時にMicrosoft.Bcl.Build.Targetsがないといわれる場合の対処 - 新日々此何有哉
こちらで紹介した回避策のうち、プロジェクトファイルを直接書き換えている方法をとっていて、Microsoft.Bclのバージョンアップを行った場合、その都度プロジェクトファイルを書き換える必要があります。
後者のビルド前にNugetのパッケージアップデート処理を入れている場合、たぶん何もしなくていいはずです。
でも、せっかくNuGet 2.7にしたのだから、同じにしたいですよね。いくつか手動で書きかえればNuGet 2.7の状態で新規にソリューションを作成した状態と同じにすることができます。私が検証した結果なので、うまくいかなかったらごめんなさい。一応手元では以下の手順を踏めばNuGet 2.6時代に作ったソリューションが回避策なしでもNuGet 2.7でビルドできるようになりました。

packages.configからMicrosoft.Bcl.*を削除

各プロジェクトにあるPackages.configから以下の二行を削除して保存します。

  <package id="Microsoft.Bcl" version="1.1.3" targetFramework="net45" />
  <package id="Microsoft.Bcl.Build" version="1.0.8" targetFramework="net45" />

プロジェクトファイルからMicrosoft.Bclを削除

csproj/vbprojを開いて、以下の行を削除します。少し違う場合があるかもしれませんが、要はImport ProjectでMicrosoft.Bcl.Buildの行をごそっと消します。

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

Nuget.targetsを変更

やらなくてもいいかもしれませんが、ソリューションの.NuGetフォルダにあるNuGet.targetsの記述が変わっています。

(変更前)
$(NuGetCommand) pack "$(ProjectPath)" -Properties Configuration=$(Configuration) $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols
(変更後)
$(NuGetCommand) pack "$(ProjectPath)" -Properties Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols

NuGetのビルドコマンドラインでPlatformを指定できるようになったみたいですね。いいことなので指定するようにしてみました。