2009-04-01 20 views
26

Tôi duy trì việc xây dựng một phần mềm khá lớn, bao gồm khoảng 350 dự án csharp. Thời gian xây dựng của chúng tôi cho một lần gỡ lỗi được xây dựng trong khoảng 17 phút.MSBuild & TeamBuild - Lỗi BuildInParallel vì vi phạm quyền đối với tệp MSB3021

Tôi đã tìm cách cải thiện thời gian xây dựng và thuộc tính BuildInParallel trông hấp dẫn. Đặc biệt là kể từ khi chúng tôi có một máy chủ quad-core làm các bản dựng của chúng tôi, nó thực sự có thể tận dụng lợi thế của sức mạnh tính toán.

Nhưng than ôi ... Sau khi thiết lập thuộc tính, sửa đổi tệp cấu hình cho tác nhân tạo và khởi động lại, lần chạy đầu tiên thực sự trông đầy hứa hẹn, nhanh hơn bình thường, cho đến khi không thành công.

Sau khi xem nhật ký xây dựng, có vẻ như bản dựng không thành công khi cố gắng sao chép các tham chiếu được đánh dấu là CopyLocal = true thành dir ouput. Nếu C# project A và C# project B được xây dựng song song và cả hai tham chiếu cùng dll của bên thứ ba và cố gắng sao chép cùng một lúc, quá trình thứ hai để cố gắng sao chép tệp sẽ bị vi phạm quyền truy cập tệp - tệp đang được sử dụng bởi một quy trình khác.

Bất kỳ ai có kinh nghiệm này và có thể nhận được các bản dựng nhiều proc hoạt động trên Team Build?


Đây là một trong những lỗi, khó để tìm ra dự án nào khác đang được xây dựng cùng một lúc.

Tôi đã gỡ bỏ tất cả những thứ không liên quan:

54> Target "_CopyFilesMarkedCopyLocal" trong tập tin "c: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets " từ dự án " d: \ temp \ PCM \ 1.3-Maint_CI \ Sources \ Mô-đun \ Core \ Test \ UnitTest \ TestDIPS.Core.Data.Server.NUnit \ TestDIPS.Core.Data.Server.NUnit.csproj ": 54> Tác vụ "Sao chép" Sao chép tệp từ ".......... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll" thành "d: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll ". Lệnh: sao chép/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): lỗi MSB3021: Không thể sao chép tệp " ....... ... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll "tới " d: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll ". Quá trình không thể truy cập tệp 'd: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll' vì nó đang được sử dụng bởi một quy trình khác. Hoàn thành nhiệm vụ thực thi "Sao chép" - ĐÃ FAILED. 54> Hoàn thành mục tiêu xây dựng "_CopyFilesMarkedCopyLocal" trong dự án "TestDIPS.Core.Data.Server.NUnit.csproj" - FAILED.

Trả lời

15

Các mục tiêu mặc định đi kèm với MSBuild được thiết kế cho hành vi CopyLocal - đó là những gì VS dựa vào. CopyLocal có vấn đề khi bạn xuất ra một thư mục đầu ra.

Để có thể thực sự xây dựng song song, bạn sẽ cần vô hiệu hóa một số hành vi cụ thể của CopyLocal trong Microsoft. *. Common. *. Targets files. Tôi đã nói chuyện với một số người trong nhóm MSBuild trong quá khứ, và đây là một điều đặc biệt là lông để làm. Ngay cả khi bạn làm trống một số hành vi CopyLocal, các trình kiểm tra VS test không hoạt động tốt với việc xây dựng song song.

Một số trong những điều bạn có thể bắt đầu với:

  1. hành vi Disable CopyLocal tài liệu tham khảo bằng cách thiết lập riêng là true.
  2. Vô hiệu hóa tệp CopyLocal cho tệp CopyToOutputPath khi xây dựng các Dự án phụ thuộc.
+0

Xin lỗi vì câu trả lời muộn, nhưng cảm ơn bạn rất nhiều vì câu trả lời rõ ràng. Câu trả lời của bạn phù hợp với những phát hiện mới nhất của tôi, tôi gặp vấn đề với những người truy cập thử nghiệm. Tôi thấy rằng tôi sẽ phải trục xuất những người truy cập thử nghiệm hoặc sửa đổi tệp mục tiêu, đó là điều mà chúng tôi không muốn làm. Hy vọng rằng điều này sẽ được sửa trong Team Build 2010/.Net 4.0 –

0

Trình biên dịch bạn đang sử dụng? Theo tôi biết, cho đến khi VS2005 xây dựng song song không hoạt động cho nhiều dự án. Đó là một vấn đề được biết rằng MS giữ nói rằng họ sẽ sửa chữa cuối cùng, nhưng tôi không có ý tưởng hay không họ thực sự giải quyết nó trong VS2008.

+0

Chúng tôi hoàn toàn trên TFS2008, cả khách hàng và buildserver –

1

Dường như các dự án của bạn được định cấu hình cho cùng một thư mục đầu ra. Nếu bạn cấu hình Project A và Project B để xuất ra các thư mục khác nhau, điều này sẽ giải quyết được lỗi này.

+0

Có, nhưng đây là hành vi mặc định cho TeamBuild và tôi không muốn thay đổi nó nếu không có cách nào khác để giải quyết nó. –

8

Tôi gặp vấn đề tương tự nhiều tháng trước.

Có hai loại sao chép tập tin trong file # dự án VS C (csproj files):

  1. Khảo Assemblies trong đó có một "Sao chép địa phương" bất động sản. khi thuộc tính là True, assembly được sao chép vào đường dẫn đầu ra.

  2. Tệp bổ sung có thuộc tính "Sao chép vào thư mục đầu ra". khi thuộc tính được đặt thành "sao chép luôn" hoặc "sao chép nếu mới hơn" thì tệp được sao chép vào đường dẫn đầu ra.

vấn đề:

A: Nếu hai hoặc nhiều dự án được xây dựng đồng thời, và hai trong số họ cố gắng để sao chép các tập tin tương tự vào thư mục đầu ra, bạn có thể phải đối mặt với các lỗi như "lỗi MSB3021: Không để sao chép tệp "," Truy cập vào đường dẫn bị từ chối "," Quá trình không thể truy cập tệp ", v.v.

B: Nếu hai hoặc nhiều dự án trở thành dự án chung có một số mục thuộc loại 2. Trong này trường hợp trong quá trình xây dựng song song của các dự án, hai trong số họ có thể cố gắng xây dựng mục tiêu "GetCopyToOutputDirectoryItems" của dự án chung đồng thời. Vì vậy, bạn có thể một lần nữa phải đối mặt với các trường hợp ngoại lệ trên.

Solution1:

lực lượng OutputPath của csproj khác nhau tập tin không phải là trong tha cùng con đường

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

Solution2:

Bước 1: Giải pháp là để thiết lập các tài sản của Các mục phổ biến (để Sai trong trường hợp 1 và để "không sao chép" trong trường hợp 2) cho tất cả, nhưng một trong những mục phổ biến trong dự án của bạn. hoặc loại bỏ chúng Nếu có thể.

Để tìm sai lầm tiềm năng, bạn có thể tìm kiếm dòng chữ "tin" (đối với trường hợp 1) và "CopyToOutputDirectory" (đối với trường hợp 2) trong các tập tin * csproj

Bước 2: ...

Chúc may mắn

1

Điều này cũng có thể xảy ra do tệp chỉ đọc. Trong những trường hợp đó (nghĩa là, không phải những trường hợp được trả lời bởi số lượng lớn các câu trả lời khác), there are appropriate workarounds which vary depending on whether you're able to rely on MSBuild 3.5 or later.

+0

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Tôi đang xóa mục này ngay bây giờ, nếu bạn thêm các chi tiết liên quan, hãy gắn cờ cho sự chú ý của người kiểm duyệt. – NullUserException

9

Tác vụ Sao chép MS có tính năng không có giấy tờ, ít nhất Google giữ im lặng. Nếu đặt hệ thống môi trường rộng biến MSBUILDALWAYSRETRY = 1 Nhiệm vụ này sẽ thử lại để sao chép một tập tin ngay cả khi nó bị Access Denied ngoại lệ trong hoạt động sao chép

Ví dụ về sản lượng

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. 
+2

https://github.com/Microsoft/msbuild/blob/master/src/XMakeTasks/Copy.cs –

+0

Liên kết bị hỏng –

Các vấn đề liên quan