2012-09-13 29 views
8

मैं एक MSBuild परियोजना फ़ाइलें जो समानांतर सब मेरी VS2010 समाधान के कॉन्फ़िगरेशन में बनाने की कोशिश में लिखा है:MSBuild: समानांतर बनाता है और नेट परियोजनाओं

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <ItemGroup> 
    <BuildFile Include="$(SourceRoot)MyProject.sln" /> 
    <Config Include="Debug"> 
     <Configuration>Debug</Configuration> 
    </Config> 
    <Config Include="Release"> 
     <Configuration>Release</Configuration> 
    </Config> 
    </ItemGroup> 

    <Target Name="BuildAll" Outputs="%(Config.Configuration)"> 
    <Message Text="Start building for configuration: %(Config.Configuration)" /> 
    <MSBuild Projects="@(BuildFile)" 
      Properties="Configuration=%(Config.Configuration)" 
      Targets="Build" /> 
    </Target> 
</Project> 

और मैं साथ MSBuild का शुभारंभ:

msbuild /m /p:BuildInParallel=true /t:BuildAll buildall.proj 

समस्या यह है कि मेरे समाधान में कई नेट परियोजनाएं हैं जिनमें सभी का एक ही आउटपुट फ़ोल्डर है। ये परियोजनाएं एक ही बाहरी असेंबली का उपयोग करती हैं।

तो अक्सर, दो आउटपुट निष्पादन योग्य एक ही समय में उत्पन्न होते हैं और उनकी निर्भरता एक ही समय में कॉपी की जाती है। इस तरह त्रुटियों की ओर जाता है:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3001,9): 
error MSB3021: 
Unable to copy file "xxx\NLog.dll" to "D:\src\Blackbird\shared\bin\debug\NLog.xml". The process 
cannot access the file 'xxx\NLog.dll because it is being used by another process. 

जो मुझे लगता है कि इसका मतलब है: "2 विभिन्न परियोजनाओं NLog का उपयोग करें और एक ही समय में उत्पादन फ़ोल्डर में अपने विधानसभा नकल करने की कोशिश" ...

वहाँ एक रास्ता है उस के आसपास पाने के लिए? मैं वास्तव में समाधान में सभी परियोजनाओं को संशोधित करने से बचना चाहता हूं।

कार्य स्रोत कोड "सी: \ विंडोज \ माइक्रोसॉफ्ट.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets (3001,9)" को देखते हुए, मैंने देखा है कि एमएसबिल्ड पुनः प्रयास करना संभव है प्रतिलिपि:

<Copy 
    SourceFiles="@(ReferenceCopyLocalPaths)" 
    DestinationFiles="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" 
    SkipUnchangedFiles="$(SkipCopyUnchangedFiles)" 
    OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)" 
    Retries="$(CopyRetryCount)" 
    RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" 
    UseHardlinksIfPossible="$(CreateHardLinksForCopyLocalIfPossible)" 
    Condition="'$(UseCommonOutputDirectory)' != 'true'" 
    > 

मैं स्थापित करने के लिए चर CopyRetryCount, CopyRetryDelayMilliseconds कोशिश की है, ... मुझे उम्मीद थी कि अगर प्रति विफल रहता है, एक और प्रतिलिपि में कुछ मिलीसेकेंड बाद में किया सफल हो जाएगा। लेकिन मैं इन पैरामीटर को सेट करने में असमर्थ हूं। मैं उन्हें कैसे बदल सकता हूं?

क्या कोई और समाधान है?

+0

क्या आप अपने उत्पाद के हिस्से के रूप में एनएलओजी बना रहे हैं या क्या यह सिर्फ स्रोत नियंत्रण में चेक किया गया है? यदि आप इसे बना रहे हैं, तो क्या यह संभव है कि आपकी कुछ परियोजनाएं परियोजना के बजाय बाइनरी स्थान का संदर्भ दें? –

उत्तर

3

मैं समाधान

<MSBuild Projects="@(BuildFile)" 
    Properties="Configuration=%(Config.Configuration);Retries=10;RetryDelayMilliseconds=50" 
    Targets="Build" /> 

पाया है यह उम्मीद के रूप में काम करता है, लेकिन अब यह प्रति

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3001,9): 
warning MSB3026: Could not copy 
"D:\src\xxx\System.Data.SQLite.pdb" to "..\Debug\System.Data.SQLite.pdb". 
Beginning retry 1 in 50ms. The process cannot access the file 
'..\Debug\System.Data.SQLite.pdb' because it is being used by another process. 

पुन: प्रयास करने से पहले एक चेतावनी उत्पन्न करता है मेरा आखिरी परीक्षण के दौरान, यह 36 गुना इस चेतावनी उत्पन्न! चेतावनी MSB0326 चेतावनी दबाने का कोई तरीका है?

0

सामान्य रूप से, निर्माण के दौरान चलने वाली किसी भी चीज़ को अपने इनपुट पर एक विशेष लॉक प्राप्त नहीं करना चाहिए - केवल साझा-पढ़ा हुआ लॉक। ऐसा लगता है कि आपकी बिल्ड प्रक्रिया में कुछ (शायद एनएलओजी, जो कुछ भी है) इसका उल्लंघन करता है - इनपुट "xxx\NLog.dll" पर यह विशेष लॉक लेता है, इसलिए जब कोई अन्य एमएसबिल्ड नोड उसी इनपुट की प्रतिलिपि बनाने का प्रयास करता है तो यह विफल हो जाता है।

पुनः प्रयास आपके विशेष लक्षण के लिए एक उचित कार्यवाही है - हालांकि यह हमेशा सफल होने की गारंटी नहीं है।

0

मुझे एक ही समस्या थी। एमएसबिल्ड द्वारा उत्पादित डीएलएल को पवित्र करने से बचने के लिए मुझे अपने एंटीवायरस में उचित अपवाद जोड़ने की आवश्यकता थी।