2012-09-20 11 views
7

मैं अपनी एनएएनटी स्क्रिप्ट से एक निश्चित EXE को कॉल करना चाहता हूं, और संपत्ति मौजूद होने पर किसी संपत्ति को तर्क के रूप में पास करना चाहता हूं, या अन्यथा कुछ भी पास नहीं करता हूं।संपत्ति अस्तित्व के आधार पर सशर्त रूप से NANT निष्पादन कार्य के लिए तर्क कैसे पारित करें?

नीचे कोड इस मामले के लिए सिर्फ फिट करने के लिए लगता है, लेकिन यह काम नहीं करता:

<exec program="notepad.exe"> 
    <arg line="${file}" if="${property::exists('file')}" /> 
</exec> 

यह Property 'file' has not been set त्रुटि फेंक देते हैं। ऐसा लगता है कि यह स्थिति को अनदेखा करने वाली संपत्ति का मूल्यांकन करता है। मैं इसकी स्थिति false की स्थिति में पूरे <arg> तत्व को अनदेखा करने की अपेक्षा करता हूं।

यदि मैं इस ब्लॉक के ऊपर की संपत्ति को परिभाषित करता हूं, तो यह स्पष्ट रूप से ठीक काम करता है (भले ही संपत्ति खाली हो)। यदि यह एक ही मामला है, तो यह एक कामकाज के लायक हो सकता है, लेकिन मुझे कई तरह की संपत्तियां पास करनी होंगी। इसके अलावा, <if><exec> के तहत एक वैध तत्व नहीं है ...

यह कैसे प्राप्त करें? कोई विचार?

उत्तर

7

मैं an old thread at NAnt mailing list बाहर डेग, जो वास्तव में (मेरे मामले को) एक वैकल्पिक हल के लिए सबसे अच्छा सुझाव देता है: यह मेरा बदसूरत समाधान नहीं है। यह इस तथ्य पर आधारित है कि <property> कार्य अपेक्षा के अनुसार काम करता है। वर्कअराउंड यह निर्धारित करने के लिए एक अतिरिक्त संपत्ति पेश करता है कि मूल संपत्ति परिभाषित की गई है या नहीं।

इस तरह

:

<target name="example"> 
    <property name="arg.value" value="${arg}" if="${property::exists('arg')}" /> 
    <property name="arg.value" value="" unless="${property::exists('arg')}" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

मेरे मामले में यह पता चला है आसान हो करने के लिए हमेशा डिफ़ॉल्ट मान के साथ एक गुण सेट करने के लिए, और यहां तक ​​कि एक अतिरिक्त संपत्ति का परिचय नहीं है - बस <arg/> करने के लिए मूल संपत्ति पारित:

<target name="example"> 
    <property name="arg.value" value="default value" overwrite="false" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

यह अन्य फ़ाइलों में ओवरराइट किया जा सकता है (और होगा)।

मुझे another thread where the same question was asked भी मिला है, और एनएएनटी विकास में शामिल एक व्यक्ति ने यह इंगित करने के लिए सुझाव दिया है कि क्या <arg> तत्व के लिए इसे ठीक करने के लिए लोगों को पैच में रुचि है या नहीं। जहां तक ​​मैं देख सकता हूं, कोई भी ब्याज का प्रदर्शन नहीं करता :), इसलिए व्यवहार नहीं बदला गया था।

मैंने कुछ समय तय करने में कामयाब रहा कि यह ठीक हो सकता है, और ऐसा लगता है कि यह केवल को TaskAttribute में जोड़ने के लिए है। line<arg> कार्य की संपत्ति। <property value="..."> विशेषता के लिए भी ऐसा किया जाता है जहां यह अपेक्षा के अनुसार काम करता है। मैंने इसे आजमाया नहीं, हालांकि - अगर मेरे पास इन दिनों में से कुछ और समय है, तो मैं यहां एक अपडेट पोस्ट करूंगा और पोस्ट करूंगा।

+0

आप वैकल्पिक रूप से उसी वैरिएबल को डिफ़ॉल्ट रूप से सेट कर सकते हैं जिसे आप पढ़ रहे हैं। यह अधिक स्पष्ट लगता है और इसके बजाय एक ही कथन है। <संपत्ति का नाम = "arg" value = "false" जब तक = "$ {property :: मौजूद नहीं है ('arg')}" /> – BradLaney

+0

आपके उपयोग के मामले के आधार पर, क्या आपका मतलब आपके दूसरे कोड स्निपेट के लिए है? <लक्ष्य नाम = "उदाहरण"> <संपत्ति का नाम = "तर्क" मान = "डिफ़ॉल्ट मान" ओवरराइट = "झूठा" />

0

उस स्थिति के लिए, आप केवल तर्क के रूप में पास करने के लिए एक फाइलसेट का उपयोग कर सकते हैं। डिफ़ॉल्ट रूप से, फाइलसेट में वे आइटम शामिल नहीं होते हैं जो डिस्क पर वास्तविक फ़ाइलों से मेल नहीं खाते हैं।

+0

आपके सुझाव के लिए धन्यवाद। दुर्भाग्य से, यह केवल फाइलों के बारे में नहीं है - यह सिर्फ एक नमूना था। मुझे विभिन्न प्रकृति के तर्कों की एक बड़ी संख्या उत्तीर्ण करनी है। मैं जो जवाब देता हूं उसे मैं जवाब दूंगा। –

0

मैं भी इस मुद्दे में भाग गया (ईमानदार होने के लिए भी एक बार से अधिक)। if - कुछ मामलों में योगदान ऐसा काम नहीं करता है जैसा आप उम्मीद कर सकते हैं।

<choose> 
    <when test="${property::exists('file')}"> 
    <exec program="notepad.exe"> 
     <arg line="${file}" /> 
    </exec> 
    </when> 
    <otherwise> 
    <exec program="notepad.exe" /> 
    </otherwise> 
</choose> 
+0

आपके सुझाव के लिए धन्यवाद। खैर, यह 1 तर्क के लिए समझ में आता है - लेकिन मुझे बड़ी संख्या में तर्क पारित करना होगा। मैं जो जवाब देता हूं उसे मैं जवाब दूंगा। –

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