2008-09-16 12 views
20

मैं एक चर के आधार पर विभिन्न गुणों फ़ाइल को लोड करना चाहते हैं।वहाँ एक रास्ता गतिशील NAnt में एक गुण फ़ाइल लोड करने के है?

असल में, अगर एक देव का निर्माण उपयोग इस गुण दायर कर रही है, अगर एक परीक्षण का निर्माण उपयोग इस अन्य संपत्तियों दायर कर रही है, और अगर एक उत्पादन का निर्माण उपयोग अभी तक एक तिहाई गुण दायर कर।

उत्तर

26

चरण 1: पर्यावरण के लिए निर्माण कर रहे हैं ट्रैक करने के लिए अपने NAnt स्क्रिप्ट में एक संपत्ति को परिभाषित करें (स्थानीय, परीक्षण, उत्पादन, आदि)।

<property name="environment" value="local" /> 

चरण 2: आप पहले से ही एक विन्यास या प्रारंभ लक्ष्य है कि सभी लक्ष्यों पर निर्भर करता है की जरूरत नहीं है, तो एक विन्यास लक्ष्य बनाते हैं, और सुनिश्चित करें कि आपके अन्य लक्ष्यों पर निर्भर करते हैं।

<target name="config"> 
    <!-- configuration logic goes here --> 
</target> 

<target name="buildmyproject" depends="config"> 
    <!-- this target builds your project, but runs the config target first --> 
</target> 

चरण 3: आपके विन्यास लक्ष्य अपडेट एक उपयुक्त गुण पर्यावरण संपत्ति के आधार पर फ़ाइल में खींचने के लिए।

<target name="config"> 
    <property name="configFile" value="${environment}.config.xml" /> 
    <if test="${file::exists(configFile)}"> 
     <echo message="Loading ${configFile}..." /> 
     <include buildfile="${configFile}" /> 
    </if> 
    <if test="${not file::exists(configFile) and environment != 'local'}"> 
     <fail message="Configuration file '${configFile}' could not be found." /> 
    </if> 
</target> 

ध्यान दें, मैं टीम के सदस्यों को अपने स्वयं के local.config.xml फ़ाइलों को स्रोत नियंत्रण करने के लिए प्रतिबद्ध नहीं मिलता है परिभाषित करने के लिए अनुमति देने के लिए पसंद करते हैं। यह स्थानीय कनेक्शन तार या अन्य स्थानीय पर्यावरण सेटिंग्स को संग्रहीत करने के लिए एक अच्छी जगह प्रदान करता है।

चरण 4:

  • nant डी: पर्यावरण संपत्ति जब आप NAnt, जैसे आह्वान सेट वातावरण = देव
  • nant डी: पर्यावरण = परीक्षण
  • nant डी: पर्यावरण = उत्पादन
+0

आपकी लाइन संदेश के साथ मेरे लिए विफल रहता है: "लक्ष्य में कार्य की अनुमति नहीं है। परियोजना स्तर पर होना चाहिए।" – vakman

0

जिस तरह से मैंने इस तरह की चीज की है, nant task का उपयोग करके निर्माण के प्रकार के आधार पर पृथक निर्माण फ़ाइलों को शामिल करना है। एक संभावित विकल्प के iniread task in nantcontrib उपयोग करने के लिए हो सकता है।

5

आप मुख्य निर्माण फ़ाइल के भीतर एक और निर्माण फ़ाइल (अपनी गुणधर्मों सहित) को शामिल करने के लिए include कार्य का उपयोग कर सकते हैं। include काम के लिए एक चर के खिलाफ परीक्षण कर सकते हैं की if विशेषता निर्धारित करने के लिए निर्माण फ़ाइल शामिल किया जाना चाहिए:

<include buildfile="devPropertyFile.build" if="${buildEnvironment == 'DEV'}"/> 
<include buildfile="testPropertyFile.build" if="${buildEnvironment == 'TEST'}"/> 
<include buildfile="prodPropertyFile.build" if="${buildEnvironment == 'PROD'}"/> 
5

मुझे ऐसी ही समस्या थी जो स्कॉट.cलिगन से आंशिक रूप से हल हो गई थी, हालांकि मैं चाहता था कि लोग पर्यावरण को स्थापित करने और लोड करने में सक्षम हों ppropriate गुण सिर्फ इसलिए की तरह एक लक्ष्य निर्दिष्ट द्वारा दायर:

  • nant देव
  • nant परीक्षण
  • nant चरण

आप एक लक्ष्य है कि वातावरण चर सेट जोड़ कर ऐसा कर सकते हैं। उदाहरण के लिए:

<target name="dev"> 
    <property name="environment" value="dev"/> 
    <call target="importProperties" cascade="false"/> 
</target> 

<target name="test"> 
    <property name="environment" value="test"/> 
    <call target="importProperties" cascade="false"/> 
</target> 

<target name="stage"> 
    <property name="environment" value="stage"/> 
    <call target="importProperties" cascade="false"/> 
</target> 

<target name="importProperties"> 
    <property name="propertiesFile" value="properties.${environment}.build"/> 
    <if test="${file::exists(propertiesFile)}"> 
    <include buildfile="${propertiesFile}"/> 
    </if> 
    <if test="${not file::exists(propertiesFile)}"> 
    <fail message="Properties file ${propertiesFile} could not be found."/> 
    </if> 
</target>