2009-09-03 10 views
11

मैं अन्य टार्गर्ट में जीवित एक निर्माण लक्ष्य में परिभाषित मान कैसे रखूं? यदि प्रॉपर्टी ग्रुप एमएसबिल्ड इकाई नहीं लिखता है तो मुझे यहां उपयोग करना चाहिए, क्या है? ReleaseDir "पैकेज" लक्ष्य में ठीक प्रिंट किया जाता है, लेकिनएक एमएसबिल्ड कार्य से दूसरे समूह में संपत्ति समूह मूल्य पास करना

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDirBase> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

उत्तर

21

"DoPackage" में रिक्त है वहाँ गुण और CallTarget कार्य के साथ एक well known issue है। आपको इसके बजाय DependsOnTargets का उपयोग करना चाहिए।

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleasesDir)"/> 
</Target> 

<Target Name="PrePackage" DependsOnTargets="Package"> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/> 
</Target> 

<!-- Do the actual packaging --> 
<Target Name="DoPackage" DependsOnTargets="Package"> 
    <Message Text="Creating package in '$(ReleasesDir)'"/> 
    <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleasesDir)"/> 
</Target> 
+0

मुझे रिलीजडियर मौजूद होने पर केवल ड्राइव चलाने की इच्छा है (मैंने इसे प्राप्त करने के लिए कॉलटाइटल में शर्त का उपयोग किया था)। क्या मैं DependsOnTarget का उपयोग कर इसे प्राप्त कर सकता हूं? – ripper234

+0

अब जब मैं वास्तव में आपके द्वारा पोस्ट किए गए लिंक को पढ़ता हूं, तो समाधान सरल है - मैंने 'DefineProperties' नामक एक अलग कार्य लिखा है, और इसके समाप्त होने के बाद गुण ... परिभाषित हैं। धन्यवाद। – ripper234

+0

हाँ, यह समाधान है, मैंने नमूना अपडेट किया है। –

1

यदि कोई व्यक्ति किसी लक्ष्य को संपत्ति पास करना चाहता है, तो एमएसबिल्ड कार्य उपयोगी हो सकता है। अलग-अलग संपत्ति मूल्यों के साथ कई बार लक्ष्य को कॉल करने का यही एकमात्र तरीका है, लेकिन यह आइटम या आइटम समूहों में गुजरने की अनुमति नहीं देता है। जूलियन से जुड़े धागे में यह comment देखें।

... [सी] सभी एमएसबिल्ड इस पर फिर से लक्षित लक्ष्य, इस बार आवश्यक गुणों में गुजर रहा है। यह वृद्धिशील इमारत को छोड़ देता है ..., लेकिन इसमें कई सीमाएं हैं, अर्थात् आप वस्तुओं में पास नहीं कर सकते हैं और आपको यह निर्दिष्ट करना होगा कि कौन से गुण पारित करने की आवश्यकता है।

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="DoPackage" Properties="ReleaseDir=$(ReleaseDir)" /> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

इस तकनीक को उपयोगी है यदि आप एक सबरूटीन, जो आपको अलग से अधिक बार फोन कर सकते हैं के रूप में लक्ष्य उपयोग करना चाहते हैं:

अपने कोड स्निपेट MSBuild कार्य का उपयोग कर की तरह लग रहे हैं क्या है पैरामीटर मान उदाहरण के लिए, कई उत्पाद कॉन्फ़िगरेशन के लिए बिल्ड प्रक्रिया को कॉल करने के लिए।

1

यह इस समस्या को हल करने के लिए स्पष्ट तरीका नहीं हो सकता है, लेकिन कुछ अभी भी निर्माण फ़ाइल पर CallTarget का उपयोग करना चाहता है, वह/वह PropertyGroup एक और लक्ष्य में परिभाषित करना होगा, के बाद इस का हल है अजीब समस्या

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp"> 
    <CallTarget Targets="CompileSolution"/> 
</Target> 
<Target Name="DebugBuildProp"> 
    <PropertyGroup> 
    <Configuration>Debug</Configuration> 
    </PropertyGroup> 
</Target> 
<Target Name="CompileSolution"> 
    <Message Text="$(Configuration)" /> 
</Target> 
+0

'' DeugBuild' Configuration' का मूल्य अपडेट हो जाता है, तो ' CompileSolution' अभी भी नए मान का उपयोग नहीं करेगा। – makhdumi

+0

@ अल-मुहांडीस वास्तव में करता है, मुझे नहीं पता कि क्यों, लेकिन यदि आप निर्भरता पर संपत्ति को परिभाषित करते हैं तो कॉलटाइटल का उपयोग करके आप जिन अन्य लक्ष्यों को कॉल करते हैं, उनके पास मूल्य होगा। यह अपने आप का प्रयास करें –

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