2009-04-01 17 views
26

Ben yaklaşık 350 csharp projelerden oluşan oldukça büyük bir yazılım parçası oluşturmak. Hata ayıklama için yapım süremiz yaklaşık 17 dakikadır.MSBuild & TeamBuild - BuildInParallel başarısız nedeniyle MSB3021 dosya izni ihlali

Oluşturma süresini geliştirmenin yollarını araştırıyorum ve BuildInParallel özelliği ilgi çekici görünüyordu. Özellikle dört çekirdekli bir sunucumuz olduğu için, aslında bilgisayar gücümüzden faydalanabilmeli.

Ama alas ... Mülkünüzü kurduktan sonra, yapılandırma aracının yapılandırma dosyasını değiştirip yeniden başlattıktan sonra, ilk çalıştırma gerçekten başarısız oldu.

Yapı günlüklerine baktıktan sonra, CopyLocal = true olarak belirtilen referansları kopyalamaya çalışırken, yapı başarısız oluyor gibi görünüyor. C# projesi A ve C# B projesi paralel olarak oluşturulmuşsa ve her ikisi de aynı üçüncü taraf dll'ye başvurur ve aynı anda kopyalamaya çalışırsa, dosyayı kopyalamaya çalışmak için ikinci işlem bir dosya erişim ihlali alır - Dosya başka bir işlem tarafından kullanılıyor.

Bunu yaşayan ve Team Build üzerinde çalışan çok procalı bir yapıya sahip olan var mı?


Burada, başka hangi projenin aynı zamanda oluşturulduğunu anlamak zor olan hatalardan biri.

Ben olmayan tüm ilgili şeyler kaldırdık: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets: dosyanın "c

54> Hedef "_CopyFilesMarkedCopyLocal" " projesinden " d: \ temp \ PCM \ 1.3-Maint_CI \ Sources \ Modules \ Core \ Test \ UnitTest \ TestDIPS.Core.Data.Server.NUnit \ TestDIPS.Core.Data.Server.NUnit.csproj ": 54> Görev "Kopyala" Dosya kopyalama ".......... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll" için "d: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll". Komut: 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): hatası MSB3021: Dosya kopyalanamadı " ....... ... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll " için" d: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll ". işlemi, başka bir işlem tarafından kullanılmakta olduğundan 'd: \ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll' dosyasına erişemiyor. "Kopyalama" görevi yürütme işlemi tamamlandı - FAILED. 54> "TestDIPS.Core.Data.Server.NUnit.csproj" projesindeki "_CopyFilesMarkedCopyLocal" hedefleme hedefi tamamlandı - FAILED.

cevap

15

MSBuild ile birlikte gelen varsayılan hedefler, CopyLocal davranışı için tasarlanmıştır; VS'ye bağlı olan budur. Tek bir çıkış dizinine çıktı verirken CopyLocal sorunludur.

Paralel olarak tam olarak oluşturabilmek için, Microsoft'taki çeşitli CopyLocal'a özgü davranışları devre dışı bırakmanız gerekir. * Ortak. *. Dosyaları hedefler. Geçmişte MSBuild takımında bazı milletlerle konuştum ve bu özellikle yapılması gereken tüyler ürpertici bir şey. Bazı CopyLocal davranışları boş olsa bile, VS test erişimcileri paralel olarak oluşturma ile iyi davranmaz.

sen başlayabilirsiniz şeylerin bazıları: true özel ayarlayarak referanslar için

  1. Devre Dışı CopyLocal davranış.
  2. Bağlantılı Projeler oluştururken CopyToOutputPath dosyaları için CopyLocal'ı devre dışı bırakın.
+0

Geç cevap için özür dilerim, ancak açıklayıcı cevap için çok teşekkür ederim. Cevabınız en son bulgularıma uygun, test erişimcilerle problemlerim vardı. Test girişimlerini iptal etmem veya hedef dosyasını değiştirmem gerektiğini, ki yapmak istemediğimiz bir şey olduğunu buldum. Umarız bu, Team Build 2010/.Net 4.0 –

0

Hangi derleyiciyi kullanıyorsunuz? Bildiğim kadarıyla, VS2005 paralel yapısına kadar pek çok proje için çalışmaz. MS'nin sonunda düzeltebileceklerini söyleyen bilinen bir sorun var, ama VS2008'de gerçekten çözüp çözmediklerine dair bir fikrim yok.

+0

Biz TFS2008 tamamen hem müşteriler kopyalama işleminin çıkışının

Örnek sırasında erişim engellendi istisna konum alır ve buildserver –

1

Projelerinizin aynı çıkış dizinine yapılandırılmış gibi görünüyor. Project A ve Project B'yi farklı dizinlere çıkış yapacak şekilde yapılandırırsanız, bu hatayı giderir.

+0

Evet, ancak bu, TeamBuild için varsayılan davranıştır ve etrafta dolaşmanın başka bir yolu yoksa değiştirmek istemiyorum. –

8

Aynı problemi aylar önce de görüyorum.

(dosyalar .Csproj) VS C# proje dosyalarında dosya kopyası iki tipi vardır:

  1. bir "Kopya yerel" özelliğine sahiptir Başvurulan Meclisleri. Özellik true olduğunda, derleme çıktı yoluna kopyalanır. "Çıkış Dizini'ne Kopyala" özelliğine sahip ek dosyalar. özellik "her zaman kopyala" veya "daha yeni kopyala" olarak ayarlandığında, dosya çıktı yoluna kopyalanır.

sorun:

A: İki veya daha fazla proje eş zamanlı inşa edilir ve bunlardan iki çıkış dizine aynı dosyayı kopyalamak çalışırsa, hatanın MSB3021" gibi hatalar ile karşı karşıya olabilir: açılamıyor "," Dosya kopyalamak için "," "Erişim", "dosyaya erişilemiyor", "Dosya, dosyaya erişemiyor", vb.

B: İki veya daha fazla proje, 2. türde bazı öğelere sahip ortak bir projeyi yeniden kazanırsa Projelerin paralel yapısı sırasında, ikisi ortak projenin eşzamanlı olarak "GetCopyToOutputDirectoryItems" hedefini oluşturmaya çalışabilir. Böylece yine yukarıdaki istisnalarla karşı karşıya kalabilirsiniz.

Solution1: Çözüm özelliğini ayarlamaktır:

Adım1: Farklı .csproj ait OutputPath tha aynı yolda olmamaya dosyaları

kuvvet solution2

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

Ortak Öğeler (1. Durumda False) ve projenizdeki bu ortak öğelerden biri hariç tümü için 2) "kopyalamayın". ya da bunları kaldırmak mümkün ise. Potansiyel hataları bulmak için

, kelimeler "özel" ve "CopyToOutputDirectory" (durum 1 için) dosyalarında (durum 2 için) * .Csproj

Adım2 arayabilirsiniz: ...

Good Luck nedeniyle dosyaya

1

bu da oluşabilir Salt Okunur ediliyor. Bu durumlarda (diğer cevapların kapsamı dışında olanlar), there are appropriate workarounds which vary depending on whether you're able to rely on MSBuild 3.5 or later.

+0

'da düzeltilecektir. Bu, teorik olarak, temel parçaları içerecek şekilde [tercih edilebilir] (http://meta.stackexchange.com/q/8259) soruyu yanıtlayabilir. Buradaki cevabı ve referans için bağlantıyı sağlayın. Şimdilik bunu siliyorum, ilgili ayrıntıları eklerseniz, moderatörün dikkatini çekmek için işaretleyin. – NullUserException

9

MS Build Copy görevi belgesiz bir özelliğe sahip, en azından Google sessizliği koruyor. set sistem çapında ortam değişkeni MSBUILDALWAYSRETRY = 1 Bu görev bir dosyayı kopyalamak yeniden deneyecektir Eğer bile

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

Bağlantı bozuk –