読者です 読者をやめる 読者になる 読者になる

Visual Studio 2015にしたらNuget restoreで参照設定が復元されなくなった

.NET NuGet

Jenkinsで流すと、nuget restoreは一見正常に終了しているが次のMSBuildでエラーになります。

エラーは次の通り。(ちょっと長いけど)

ResolveAssemblyReferences:
  プライマリ参照 "log4net" です。
C:\Program Files\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: この参照を解決できませんでした。アセンブリ "log4net" が見つかりませんでした。アセンブリが間違いなくディスクに存在することを確認してください。 コードにこの参照が必要な場合、コンパイル エラーが発生する可能性があります。 [c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj]
          検索パスは "{TargetFrameworkDirectory}" です。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\log4net.exe" を考慮しましたが、存在しませんでした。
          検索パスは "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}" です。
          AssemblyFoldersEx の場所が考慮されました。
          検索パスは "{AssemblyFolders}" です。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\IIS\Microsoft Web Deploy V3\log4net.exe" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.winmd" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.dll" を考慮しましたが、存在しませんでした。
          "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\log4net.exe" を考慮しましたが、存在しませんでした。
          検索パスは "{GAC}" です。
          GAC で見つからなかった "log4net" を考慮しました。
          検索パスは "{RawFileName}" です。
          "log4net" をファイル名として扱いましたが、存在しませんでした。
          検索パスは "bin\x86\Release\" です。
          "bin\x86\Release\log4net.winmd" を考慮しましたが、存在しませんでした。
          "bin\x86\Release\log4net.dll" を考慮しましたが、存在しませんでした。
          "bin\x86\Release\log4net.exe" を考慮しましたが、存在しませんでした。
  AssemblyFoldersEx の場所:"{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}"
          C:\Program Files\NUnit 2.6.3\bin\framework\
          C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ReferenceAssemblies\v4.0\
          C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v4.0\
          
          C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\
          C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Prototyping\Libraries\
          C:\Program Files\Microsoft SDKs\Expression\Extensions\FXG\Libraries\.NETFramework\v4.0\
          C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\
          C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ReferenceAssemblies\v2.0\
          C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\
          C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\
          C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop
          C:\Program Files\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\
          C:\Program Files\Microsoft Chart Controls\Assemblies
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します。
CoreCompile:
  C:\Program Files\MSBuild\14.0\bin\csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /platform:x86 /errorreport:prompt /define:TRACE /highentropyva- /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Configuration.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.Linq.dll" /filealign:512 /optimize+ /out:obj\x86\Release\bar.dll /ruleset:"C:\Program Files\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\ManagedMinimumRules.ruleset" /target:library /utf8output Properties\AssemblyInfo.cs src\Ibar.cs src\bar4net.cs src\barBase.cs src\barManager.cs "C:\Users\jenkins\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cs"
  Using shared compilation with compiler from directory: C:\Program Files\MSBuild\14.0\bin
src\bar4net.cs(11,17): error CS0246: 型または名前空間の名前 'log4net' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。 [c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj]
プロジェクト "c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar\bar.csproj" (Rebuild ターゲット) のビルドが終了しました -- 失敗。
プロジェクト "c:\jenkins\workspace\Foo_bar_develop-CTIV4IL2JPHXPYVJDTYNNVX42T665ZR7U5MNMTNIGCKMRODFHMAA\src\bar.sln" (Rebuild ターゲット) のビルドが終了しました -- 失敗。

ビルドに失敗しました。

Jenkinsのビルド用スレーブでVisual Studioを起動してからUpdate-Package -reinstallすれば直った。
が、CI的にはVS開いてゴニョゴニョしたくないのでスレーブのcsprojファイルを参考に以下のように元ファイルを修正したら、nuget restoreで参照設定が壊れなくなった!

  <ItemGroup>
    <Reference Include="log4net">
      <HintPath>..\packages\log4net.2.0.7\lib\net40-full\log4net.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>

でもこれってファイルの数が増えたらたまんないな。。。
もっといいやり方がありそうだけど。いや、あるべきだ!