2010-01-08 12 views
23

मेरे प्रोजेक्ट के build.xml में मेरे पास एक प्रॉपर्टी परिभाषित है:सापेक्ष पथ प्राप्त करने के लिए एक पूर्ण पथ से आधारित को कैसे पट्टी करें?

<property name="somedir.dir" location="my_project/some_dir"/> 

${somedir.dir} का मान एक पूर्ण पथ होगा: /home/myuser/my_project/some_dir

मुझे जो चाहिए वह सिर्फ ${basedir} मान /home/myuser के बिना सापेक्ष पथ ./my_project/some_dir है। मैं चींटी का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?

अब तक मुझे संपत्ति को पथ में परिवर्तित करके समाधान मिला है और फिर "pathconvert" का उपयोग करें, लेकिन मुझे नहीं लगता कि यह एक अच्छा समाधान है:

<path id="temp.path"> 
    <pathelement location="${somedir.dir}" /> 
</path> 
<pathconvert property="relative.dir" refid="temp.path"> 
    <globmapper from="${basedir}/*" to="./*" /> 
</pathconvert> 

कोई अन्य (अधिक सुरुचिपूर्ण) सुझाव ?

उत्तर

0

location प्रोजेक्ट के basedir का उपयोग कर स्वचालित रूप से पथ का विस्तार करता है। तो मुझे लगता है value विकल्प आप एक बेहतर नियंत्रण देता है:

<property name="base.dir" value="/home/myuser"/> 

और

<property name="somedir.dir" value="${base.dir}/some_dir"/> 
+0

मुझे लगता है कि आपने मेरे प्रश्न को गलत समझा। मेरे पास पहले से ही एक दिया गया पथ "$ {base.dir}/some_dir" है और मुझे सापेक्ष पथ "./some_dir" प्राप्त करने की आवश्यकता है। – blackicecube

+0

जब आप इसे '$ {somedir.dir}' में रखते हैं तो आपको 'some_dir' निकालने की आवश्यकता क्यों है? – Anonymous

+0

$ {somedir.dir} कुछ "/ home/blah/mydirectory" जैसा होगा और सवाल क्या पूछ रहा है, यह है कि इससे "./mydirectory" कैसे प्राप्त करें। तो आप केवल $ {somedir.dir} का उपयोग नहीं कर सकते हैं। नंत में पथ :: गेट-डायरेक्टरी-नाम जैसे फ़ंक्शंस का एक गुच्छा है लेकिन मुझे लगता है कि एंटी में मौजूद हैं या नहीं। मुझे यह कैसे करना है इसकी आवश्यकता भी है। – christophercotton

3

आप चींटी basename task उपयोग करने में सक्षम हो सकता है। यदि आपके पास है:

<property name="somedir" value="/path/to/file/here" /> 
<basename file="${somedir}" property="somebasedir" /> 
<echo>${somebasedir}</echo> 

प्रतिबिंबित होने वाला मान "यहां" है। यह केवल आपको अंतिम निर्देशिका देने लगता है, जो शायद आप जो चाहते हैं उसे प्राप्त न करें।

+1

यह वही है जो मैं चाहता था ... 4 साल बाद। – mfa

43

एंट 1.8.0 के बाद से आप इसके लिए relative एंट property task का उपयोग कर सकते हैं।

उदाहरण के लिए:

<property name="somedir.dir" location="my_project/some_dir"/> 
<echo message="${somedir.dir}" /> 

<property name="somedir.rel" value="${somedir.dir}" relative="yes" /> 
<echo message="${somedir.rel}" /> 

जाता करने के लिए:

<pathconvert property="relative.dir"> 
    <path location="${somepath}"/> 
    <globmapper from="${basedir}/*" to="./*" /> 
</pathconvert> 
+1

ध्यान दें कि "आधारित" विशेषता बहुत उपयोगी है क्योंकि यह डिफ़ॉल्ट आधार निर्देशिका की तुलना में किसी अन्य निर्देशिका का उपयोग करने की अनुमति देती है। हमें यह समाधान दिखाने के लिए धन्यवाद, कुछ नियमित अभिव्यक्तियों के साथ मैपर का उपयोग करने से यह बहुत आसान और अधिक विश्वसनीय है। – gouessej

7

एक थोड़ा कम वर्बोज़ समाधान को निर्दिष्ट somepath<pathconvert> अंदर होगा विंडोज़ में मेरे लिए, @Garns उत्तर से अनुकूलित:

<path id="uploadFilePath"> 
    <fileset dir="${wcm.folderName}"> 
     <include name="*" /> 
     <exclude name="*.attr" /> 
    </fileset> 
</path> 

<pathconvert property="relFilelist"> 
    <path refid="uploadFilePath" /> 
    <mapper> 
     <globmapper from="${wcm.folderName}/*" to="*" handledirsep="true" /> 
    </mapper> 
</pathconvert> 

मुझे लगता है कि handledirsep = "true" globmapper में बहुत महत्वपूर्ण है, यह नहीं तो कोई कितना भी मैं आगे/बैकस्लैश के साथ fiddled मेरे लिए काम नहीं किया। (मैं अपनी सभी चीजों को मेरी चींटी स्क्रिप्ट में आगे बढ़ता हूं, इसलिए मैं उन्हें यूनिक्स सिस्टम पर चला सकता हूं।) चींटी का मेरा संस्करण 1.8.1 है।

0

यह दृष्टिकोण है कि अच्छी तरह से काम किया गया था:

[echo] /home/.../stack_overflow/ant/my_project/some_dir 
[echo] my_project/some_dir 
संबंधित मुद्दे