2009-10-01 36 views
57

पर पैरामीटर पास करने के पैरामीटर मैं अपनी एमएसबील्ड फ़ाइल में एक पुन: प्रयोज्य लक्ष्य बनाने की कोशिश कर रहा हूं, इसलिए मैं इसे विभिन्न मानकों के साथ कई बार कॉल कर सकता हूं।MSTuild कॉलटाइटल

मैं इस तरह एक कंकाल मिल गया है:

<Target Name="Deploy"> 
    <!-- Deploy to a different location depending on parameters --> 
</Target> 

<Target Name="DoDeployments"> 
    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to dev --> 
    </CallTarget> 

    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to testing --> 
    </CallTarget> 
</Target> 

लेकिन मैं बाहर काम नहीं कर सकते कि मानकों CallTarget में प्रदान किया जाने, और फिर बारी में Target ही अनुमति देने के लिए।

उत्तर

69

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

<PropertyGroup> 
    <Environment>myValue</Environment> 
</PropertyGroup> 

<Target Name="Deploy"> 
    <!-- Use the Environment property --> 
</Target> 

हालांकि, एक आम परिदृश्य विभिन्न मानकों (यानी कई वेबसाइटों को तैनात) के साथ कई बार लक्ष्य का आह्वान करना है। उस मामले में, मैं MSBuild MSBuild कार्य का उपयोग करें और गुण के रूप में मानकों को भेजें:

<Target Name="DoDeployments"> 
    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)" 
      Targets="Deploy" /> 

    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)" 
      Targets="Deploy" /> 
</Target> 

$(MSBuildProjectFullPath) मामले में वर्तमान MSBuild स्क्रिप्ट के fullpath यदि आप किसी अन्य फाइल करने के लिए "तैनात" भेजने के लिए नहीं करना चाहती है।

आशा है कि इससे मदद मिलती है!

1

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

दूसरी तरफ, सी # (या वीबी या जो कुछ भी) में कार्यों को कार्यान्वित करना बहुत आसान है। शायद यह आपके लिए एक बेहतर समाधान है।

1
<CreateProperty 
     Value="file1"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <CallTarget Targets="Deploy"/> 
    <Message Text="$(filename)"/> 
    <CreateProperty 
     Value="file2"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <Message Text="$(filename)"/> 
    <CallTarget Targets="Deploy"/> 
+2

CreateProperty को V4 में चित्रित किया गया है। इसके बजाय एक लक्ष्य के भीतर PropertyGroup का उपयोग करें। रेफरी: http://msdn.microsoft.com/en-us/library/ms171458.aspx – WooWaaBob

17

आप एक लक्ष्य के साथ एक ItemGroup से अधिक 'foreach', केवल आप declaritive ढंग से यह करने के लिए हो सकता है। तुम भी कोड उदाहरण की तरह, मदों में अतिरिक्त मेटाडेटा हो सकता है:

<ItemGroup> 
    <What Include="Dev"> 
     <How>With bugs</How> 
    </What> 
    <What Include="Test"> 
     <How>With tests</How> 
    </What> 
    <What Include="Chicken"> 
     <How>Deep fried</How> 
    </What> 
</ItemGroup> 

<Target Name="Deploy"> 
    <Message Text="@(What), %(How)" /> 
</Target> 

लक्ष्य के अंदर एक अदिश मूल्य @(What) के रूप में एक आइटम समूह का उपयोग करते हुए काम कर देता है, और %(How) संदर्भ एक foreach मद में एक मेटाडाटा तत्व।

यह msbuild में चीजों को करने का एक स्वाभाविक तरीका है, उदाहरण के लिए आप विजुअल स्टूडियो के साथ उत्पन्न प्रोजेक्ट फ़ाइलों में हर जगह यह पैटर्न पा सकते हैं।