27

私は、約 350 の csharp プロジェクトで構成される、かなり大きなソフトウェアのビルドを維持しています。デバッグ ビルドのビルド時間は約 17 分です。

ビルド時間を改善する方法を検討してきましたが、BuildInParallel プロパティは興味深いものでした。特に、クアッドコア サーバーでビルドを行っているため、コンピューティング パワーを実際に活用できるはずです。

しかし悲しいかな...プロパティを設定し、ビルドエージェントの構成ファイルを変更して再起動した後、最初の実行は、失敗するまで、通常よりもはるかに高速で、本当に有望に見えました.

ビルド ログを確認した後、CopyLocal=true としてマークされた参照を出力ディレクトリにコピーしようとすると、ビルドが失敗したように見えます。C# プロジェクト A と C# プロジェクト B が並行してビルドされ、両方が同じサードパーティ dll を参照し、同時にコピーしようとすると、ファイルをコピーしようとする 2 番目のプロセスでファイル アクセス違反が発生します -ファイルは別のプロセスによって使用されています。

誰かがこれを経験し、マルチプロセス ビルドをチーム ビルドで動作させることができましたか?


これは失敗の 1 つです。他のどのプロジェクトが同時に構築されていたのかを把握するのは困難です。

関連のないものはすべて削除しました。

54>プロジェクト「d:\temp\PCM\1.3-Maint_CI\Sources\Modules\Core\」のファイル「c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets」のターゲット「_CopyFilesMarkedCopyLocal」 Test\UnitTest\TestDIPS.Core.Data.Server.NUnit\TestDIPS.Core.Data.Server.NUnit.csproj": 54>Task "Copy" Copying file from "..........\Bin\ 3rdParty\Oracle\Oracle.DataAccess.dll」を「d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll」に。コマンド: copy /y ".....\Bin\3rdParty\Oracle\Oracle.DataAccess.dll" "d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll " 54>c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9): エラー MSB3021: ファイルをコピーできません ".....\Bin\サードパーティ\Oracle\Oracle.DataAccess.dll" 「d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll」に。別のプロセスで使用されているため、プロセスはファイル 'd:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll' にアクセスできません。タスク「コピー」の実行が完了 -- 失敗。54>プロジェクト「TestDIPS.Core.Data.Server.NUnit.csproj」でターゲット「_CopyFilesMarkedCopyLocal」のビルドを完了 -- 失敗。

4

6 に答える 6

10

MS Build Copy タスクには文書化されていない機能があり、少なくとも Google は黙っています。システム全体の環境変数 MSBUILDALWAYSRETRY=1 を設定すると、コピー操作中にアクセス拒否例外が発生しても、このタスクはファイルのコピーを再試行します。

出力例

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Got System.UnauthorizedAccessException: Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
   at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
   at Microsoft.Build.Tasks.Copy.CopyFileWithLogging(FileState sourceFileState, FileState destinationFileState)
   at Microsoft.Build.Tasks.Copy.DoCopyWithRetries(FileState sourceFileState, FileState destinationFileState, CopyFileWithState copyFile) copying C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll to C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll and HR is -2147024891
 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Retrying on ERROR_ACCESS_DENIED because MSBUILDALWAYSRETRY = 1
 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Could not copy "C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll" to "C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll". Beginning retry 1 in 1000ms. Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
于 2013-03-23T06:34:51.570 に答える
9

私は何ヶ月も前に同じ問題を抱えています。

VS C# プロジェクト ファイル (.csproj ファイル) には、次の 2 種類のファイル コピーがあります。

  1. 「ローカル コピー」プロパティを持つ参照アセンブリ。プロパティが True の場合、アセンブリは出力パスにコピーされます。

  2. 「出力ディレクトリにコピー」プロパティを持つ追加ファイル。プロパティが「常にコピー」または「新しい場合はコピー」に設定されている場合、ファイルは出力パスにコピーされます。

問題:

A: 2 つ以上のプロジェクトが同時にビルドされ、そのうちの 2 つが同じファイルを出力ディレクトリにコピーしようとすると、「エラー MSB3021: ファイルをコピーできません」、「パスへのアクセスが拒否されました」などのエラーが発生する可能性があります。 、「プロセスはファイルにアクセスできません」など。

B: 2 つ以上のプロジェクトが、タイプ 2 のいくつかの項目を持つ共通プロジェクトを参照している場合。この場合、プロジェクトの並列ビルド中に、そのうちの 2 つが共通プロジェクトの「GetCopyToOutputDirectoryItems」ターゲットを同時にビルドしようとする場合があります。そのため、上記の例外に再び直面する可能性があります。

ソリューション 1:

異なる .csproj ファイルの OutputPath が同じパスにならないように強制する

http://social.msdn.microsoft.com/Forums/is/tfsbuild/thread/a62a6f98-ec44-46c1-a0d0-7f441f0db973

ソリューション 2:

ステップ 1: 解決策は、プロジェクト内のこれらの共通アイテムの 1 つを除くすべてに対して、共通アイテムのプロパティを設定することです (ケース 1 では False に、ケース 2 では「コピーしない」にします)。または可能であれば削除してください。

潜在的な間違いを見つけるために、ファイル *.csproj で "private" (ケース 1 の場合) および "CopyToOutputDirectory" (ケース 2 の場合) という単語を検索できます。

ステップ2: ...

幸運を

于 2009-11-23T07:14:59.407 に答える
1

これは、ファイルが読み取り専用であるために発生することもあります。そのような場合 (つまり、他の回答の大部分でカバーされていない場合)、MSBuild 3.5 以降に依存できるかどうかによって異なる適切な回避策があります

于 2009-11-24T16:13:46.530 に答える
1

プロジェクトが同じ出力ディレクトリに構成されているようです。プロジェクト A とプロジェクト B を別のディレクトリに出力するように構成すると、このエラーが解決されます。

于 2009-04-23T10:49:44.593 に答える
0

どのコンパイラを使用していますか? 私の知る限り、VS2005 の並列ビルドまでは、複数のプロジェクトでは機能しません。MS が最終的には修正すると言い続けている既知の問題ですが、VS2008 で実際に解決したかどうかはわかりません。

于 2009-04-23T01:44:47.287 に答える