web-dev-qa-db-ja.com

Jenkinsが新しいMSBuild復元ターゲットでNuGetパッケージを復元しない

。net 4.6.2から4.7.1に移動した.netフルフレームワークWPFアプリケーションがあり、PackageReferencepackages.configではなくcsprojファイル内。

開発マシンでのビルドは問題ないように見え、パッケージがダウンロードされて復元されますが、Windows Server 2012ビルドサーバーでJenkinsをビルドすると、nugetパッケージは正しく復元されます。

MSBuild v15.5と最新の "msbuild/restore"コマンドを使用して、ビルド時にパッケージを復元しています。注:「nuget restore」を呼び出す以前の方法を使用するとdoesは機能しますが、 msbuild/restore now を使用できるはずです。

パッケージの復元プロセスは正しいNuGetサーバーを見ているようで、エラーなしで復元を実行しているようです(これは、問題を特定するためにJenkinsでコンパイルされたテストソリューションです)。

Restore:
  Restoring packages for c:\Jenkins\workspace\Test\ConsoleApp1\ConsoleApp1.csproj...
  Committing restore...
  Generating MSBuild file c:\Jenkins\workspace\Test\ConsoleApp1\obj\ConsoleApp1.csproj.nuget.g.props.
  Generating MSBuild file c:\Jenkins\workspace\Test\ConsoleApp1\obj\ConsoleApp1.csproj.nuget.g.targets.
  Writing lock file to disk. Path: c:\Jenkins\workspace\Test\ConsoleApp1\obj\project.assets.json
  Restore completed in 577.05 ms for c:\Jenkins\workspace\Test\ConsoleApp1\ConsoleApp1.csproj.

  NuGet Config files used:
      c:\Jenkins\workspace\Test\NuGet.Config
      C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config

  Feeds used:
      http://devbuild/NuGetHost/nuget
      https://api.nuget.org/v3/index.json
Done Building Project "c:\Jenkins\workspace\Test\ConsoleApp1.sln" (Restore target(s)).

ただし、msbuildがコードをコンパイルすると、NuGetがダウンロードされていないように見える次のエラーが表示されます。

CSC : error CS0006: Metadata file 'C:\Windows\system32\config\systemprofile\.nuget\packages\log4net\2.0.8\lib\net45-full\log4net.dll' 
could not be found [c:\Jenkins\workspace\Test\ConsoleApp1\ConsoleApp1.csproj]

Nugetパッケージが復元されない理由は何ですか?

18
mips

NuGetの問題の投稿を何時間も検索および選別し、.netコアノイズを除去した後、修正しました!

いくつかの NuGet およびmsbuild msbuild によると、Windows Server 2012のローカルシステムアカウントでNuGet(またはmsbuild/restore)を使用して復元する場合、NuGetが使用するフォルダーは「ではありません」アクセス可能であるか、実行中の32ビットと64ビットのプロセスが原因で異なるフォルダーであるため、そのローカルキャッシュフォルダーにナゲットをダウンロードできません。

Msbuildがコンパイル時に参照したいこのフォルダーは、C:\ Windows\system32\config\systemprofile\.nuget\packagesのようです。

私たちの解決策は、システム全体の環境変数NUGET_PACKAGESを使用してNuGetパッケージキャッシュフォルダーをC:\ NugetPackageCacheなどのアクセス可能な別のフォルダーに設定することでした。

NUGET_PACKAGES=C:\NugetPackageCache

また、Build Environment-> Inject環境変数をbuild process-> PropertiesContentに設定することにより、Jenkinsプロジェクトごとにこれを設定できます:

NUGET_PACKAGES=C:/NugetPackageCache

これによる別の潜在的な解決法 NuGet issue post は、msbuildがnugetsを探しているフォルダーに環境変数を設定することです。

NUGET_PACKAGES=C:\Windows\system32\config\systemprofile\.nuget\packages

注:環境変数はNuGetで優先されます。 NuGet docs優先順位に言及 に更新したようには見えません。

注:環境変数を注入/設定するには、次のような EnvInject Jenkinsプラグインを使用します。

Jenkins plugin with environment variables

35
mips

.NET Frameworkプロジェクトの状況は非常に似ていますが、わずかに異なり、最近4.7.2に変換し、<PackageReference>ではなくpackages.configを使用して、サービスが実行されるWindowsベースのJenkinsサーバー上に構築しましたローカルシステムとして。私たちのケースでは、nuget restoreは単にnotプライベートMyGetフィードを見て、その結果、独自のパッケージをインストールしていないことがわかりましたそのソースは、ビルドに失敗しました。 nuget restoreコマンドに続く「使用フィード」リストに表示されていませんでした。

mips ここから回答(およびそこからリンクされたNuGetの問題)に触発され、C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.configを構成ソースとしてリストしているにもかかわらず(実際にMyGetフィードであった)設定されました)、実際にはC:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\NuGet\NuGet.configを代わりに使用していました。 system32の場所からSysWOW64の場所にNuGet.configファイルをコピーすることで問題を解決できました。

NUGET_PACKAGES環境変数を設定および挿入する必要はありませんでした。

2
Nick Jones