2010-08-03 14 views
10

मैंने एक कस्टम आम लक्ष्य "रीयलक्लीन" बनाया जो आउटपुट और "इंटरमीडिएट आउटपुट" निर्देशिका में हर फाइल को हटा देता है। मैंने इसे Microsoft.Common.targets फ़ाइल में रखा है। जब मैं अपने csproj पर एमएसबिल्ड चलाता हूं तो सब कुछ ठीक है। लेकिन जब मैं अपने SLN पर MSBuild चलाने (बस csproj की एक सूची का संदर्भ है) मैं निम्न त्रुटिसमाधान बनाने के लिए कस्टम आम लक्ष्य

error MSB4057: The target "RealClean" does not exist in the project. 

यहाँ कमांड लाइन मैं MSBuild

C:\Windows\Microsoft .NET\Framework\v3.5\MsBuild.exe /p:Configuration="Release";OutputPath="..\..\MSBuild.Referentiel.net35";nowarn="1591,1573" /t:RealClean mySolution.sln 

कोई संकेत चलाने के लिए दर्ज है?

उत्तर

5

समाधान फ़ाइल पर काम करने के लिए, MSBuild एक अस्थायी MSBuild परियोजना युक्त केवल कुछ लक्ष्यों की तरह का निर्माण और स्वच्छ फ़ाइल बनाता है। तो आप एक समाधान फ़ाइल पर अपने कस्टम लक्ष्य को कॉल नहीं कर सकते हैं।

+1

ठीक है मुझे मिल गया। मैं इस अस्थायी प्रोजेक्ट फ़ाइल में गया और इसमें बिल्ड, क्लीन, पुनर्निर्माण और प्रकाशित करें। Common.targets.files से कोई आयात नहीं। बहुत बुरा, मुझे एक और समाधान मिलना होगा। –

+0

यह किसी भी विजुअल स्टूडियो बिल्ड पर लागू नहीं होता है, है ना? – Maslow

5

मैडोगोम शायद सही है। लेकिन मैं यह जोड़ना चाहता था कि आपको Microsoft.common.targets फ़ाइलों को संपादित नहीं करना चाहिए। यदि आप ऐसा करते हैं तो आप उस मशीन पर एक अलग निर्माण प्रक्रिया होने का जोखिम बनाते हैं जो कि हर किसी के पास है। आपके मामले में आप केवल एक वास्तविक एमएसबील्ड फ़ाइल बना सकते हैं, जिसमें रियलक्लियन लक्ष्य है और इसे सी: \ प्रोग्राम फ़ाइलें (x86) \ MSBuild \ v4.0 \ Custom.After.Microsoft.Common.targets या इसके लिए 32 बिट सी: \ प्रोग्राम फ़ाइलें \ MSBuild \ v4.0 \ Custom.After.Microsoft.Common.targets और अनिवार्य रूप से यह उस फ़ाइल को Microsoft.Common.targets के अंदर डालने जैसा ही होगा, सिवाय इसके कि आप ' टी को उस फाइल को संशोधित करना होगा।

+0

धन्यवाद!वह क्लीनर होगा। –

+0

मशीन स्तर के बजाय समाधान स्तर पर इस संशोधन को अभी तक करने के लिए किसी भी तरह से? – Maslow

15

मेरे पास एक ही समस्या थी लेकिन काम करने के लिए स्रोत पेड़ के बाहर चीजों को संशोधित नहीं करना चाहता था। C: \ Program Files में फ़ाइलों को जोड़ना ... का अर्थ है कि आपको समान व्यवहार प्राप्त करने के लिए प्रत्येक देव मशीन पर इसे मैन्युअल रूप से करना होगा।

1) एक कस्टम लक्ष्य फाइल बनाई जो मैं प्रत्येक proj फ़ाइल में निम्न जोड़कर मेरी समाधान में हर सी # और/या वीबी/एफ # परियोजना में आयात:

<!-- Rest of project file --> 

<PropertyGroup Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'"> 
    <!-- Relative path to containing solution folder --> 
    <SolutionDir>..\</SolutionDir> 
</PropertyGroup> 
<Import Project="$(SolutionDir)CommonSettings.targets" /> 

मैं तीन बातें किया

2) एक स्वच्छ लक्ष्य जो वास्तविक स्वच्छ के बाद बुलाया जाता है (का उपयोग कर AfterTargets MSBuild 4.0 से विशेषता) जोड़ा गया:

<Target Name="CleanCs" AfterTargets="Clean"> 
    <Message Text="Deep cleaning C# project..." /> 
    <CreateItem Include="$(OutDir)**\*.*; $(ProjectDir)\obj\**\*.*; $(IntermediateOutputPath)**\*.*" 
          Exclude="**\bin\**\*.vshost.exe; $(IntermediateOutputPath)**\*.log"> 
     <Output TaskParameter="Include" ItemName="AfterClean_FilesToDelete"/> 
    </CreateItem> 
    <Delete Files="@(AfterClean_FilesToDelete)" /> 
    <CreateItem Include="$(ProjectDir)\obj\" > 
     <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete" /> 
    </CreateItem> 
    <CreateItem Include ="$(ProjectDir)\bin\" Condition="'$(TargetExt)' != '.exe'" > 
     <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete"/> 
    </CreateItem> 
    <RemoveDir ContinueOnError="true" Directories="@(AfterClean_DirectoriesToDelete)" /> 
</Target> 

3) मेरी निरंतर एकीकरण MSBuild परियोजना में मैं जांचें और सुनिश्चित करें कि सभी प्रोज फाइलों में # 1:

<ItemGroup> 
    <!-- Exclude viewer acceptance tests as they must compile as x86 --> 
    <CheckProjects_CsProjects Include="**\*.csproj" /> 
</ItemGroup> 
<Target Name="CheckProjects"> 
    <!-- 
     Look for C# projects that don't import CommonSettingsCs.targets 
    --> 
    <XmlRead XPath="//n:Project[count(n:Import[@Project[contains(string(), 'CommonSettingsCs.targets')]]) = 0]/n:PropertyGroup/n:AssemblyName/text() " 
     XmlFileName="%(CheckProjects_CsProjects.Identity)" 
     Namespace="http://schemas.microsoft.com/developer/msbuild/2003" 
     Prefix="n" > 
     <Output TaskParameter="Value" ItemName="CheckProjects_CsMissingImports"/> 
    </XmlRead> 
    <Error Text="Project missing CommonSettingsCs.targets: %(CheckProjects_CsMissingImports.Identity)" 
       Condition="'%(CheckProjects_CsMissingImports.Identity)' != ''" /> 
</Target> 

यह डेवलपर्स को # 1 जोड़ने से रोकने से रोकता है। आप यह सुनिश्चित करने के लिए अपना खुद का प्रोजेक्ट टेम्पलेट बना सकते हैं कि अल नई परियोजनाओं में यह डिफ़ॉल्ट रूप से है।

इस दृष्टिकोण का लाभ एक नया स्रोत वृक्ष प्रविष्टि स्थापित करने में वर्तमान स्रोत पेड़ प्राप्त करने से कुछ भी शामिल नहीं है। नकारात्मकता यह है कि जब आप उन्हें बनाते हैं तो आपको प्रोजेक्ट फ़ाइलों को एक बार संपादित करना होगा।

+0

धन्यवाद! आधे सुबह बिताए इस के लिए एक सभ्य समाधान की तलाश में; आपका # 3 बिंदु गुम लिंक था। – kenchilada

+1

धन्यवाद। यदि कुछ भी हो, तो 'आफ्टरटेक्शंस' संपत्ति ने मुझे सही पथ दिया –

+0

यह उत्तर पोस्ट होने के 7 साल बाद हो गया है। हालांकि यह अच्छा है, मैं सोच रहा हूं कि ऐसा करने के लिए अब कम वर्बोज़ तरीका है या नहीं? – Nuzzolilo

संबंधित मुद्दे