file-io - चींटी:निर्देशिका में प्रत्येक फ़ाइल के लिए कमांड कैसे निष्पादित करें?




ant build-process build-automation (8)

मैं एक निर्देशिका में प्रत्येक फ़ाइल के लिए, एक Ant buildfile से एक आदेश निष्पादित करना चाहता हूं।
मैं एक मंच-स्वतंत्र समाधान की तलाश में हूं।

मैं यह कैसे करु?

निश्चित रूप से, मैं कुछ स्क्रिप्टिंग भाषा में एक स्क्रिप्ट लिख सकता हूं, लेकिन इससे परियोजना में और निर्भरताएं जुड़ जाएंगी।


Answers

<लागू> कार्य का प्रयोग करें।

यह प्रत्येक फ़ाइल के लिए एक बार एक आदेश निष्पादित करता है। फ़ाइलों या किसी अन्य संसाधन के माध्यम से फ़ाइलों को निर्दिष्ट करें। <आवेदन> अंतर्निहित है; कोई अतिरिक्त निर्भरता की आवश्यकता नहीं है; कोई कस्टम कार्य कार्यान्वयन की आवश्यकता नहीं है।

केवल एक बार आदेश चलाने के लिए भी संभव है, सभी फ़ाइलों को एक बार में तर्क के रूप में जोड़ना। व्यवहार को बदलने के लिए समांतर विशेषता का प्रयोग करें।

एक साल देर से होने के लिए खेद है।


चींटी विरोधी cont बुरा है; एक कस्टम चींटी कार्य लिखें।

चींटी-contrib बुरा है क्योंकि यह एक घोषणात्मक शैली से एक अनिवार्य शैली में चींटी को बदलने की कोशिश करता है। लेकिन एक्सएमएल एक बकवास प्रोग्रामिंग भाषा बनाता है।

इसके विपरीत एक कस्टम चींटी कार्य आपको असली आईडीई के साथ वास्तविक भाषा (जावा) में लिखने की अनुमति देता है, जहां आप यह सुनिश्चित करने के लिए इकाई परीक्षण लिख सकते हैं कि आपके पास इच्छित व्यवहार है, और फिर अपनी बिल्ड स्क्रिप्ट में एक साफ घोषणा करें जो व्यवहार आप चाहते हैं

यह रान केवल तभी मायने रखता है जब आप रखरखाव करने वाली चींटी स्क्रिप्ट लिखने की परवाह करते हैं। यदि आप हर तरह से रखरखाव की परवाह नहीं करते हैं जो भी काम करता है। :)

जेटीएफ


जावास्क्रिप्ट और चींटी स्क्रिप्टडेफ़ कार्य का उपयोग करके ऐसा करने का तरीका यहां है, आपको इस कोड के लिए एंटी-कॉन्ट्रिब की आवश्यकता नहीं है क्योंकि scriptdef एक मुख्य चींटी कार्य है।

<scriptdef name="bzip2-files" language="javascript">
<element name="fileset" type="fileset"/>
<![CDATA[
  importClass(java.io.File);
  filesets = elements.get("fileset");

  for (i = 0; i < filesets.size(); ++i) {
    fileset = filesets.get(i);
    scanner = fileset.getDirectoryScanner(project);
    scanner.scan();
    files = scanner.getIncludedFiles();
    for( j=0; j < files.length; j++) {

        var basedir  = fileset.getDir(project);
        var filename = files[j];
        var src = new File(basedir, filename);
        var dest= new File(basedir, filename + ".bz2");

        bzip2 = self.project.createTask("bzip2");        
        bzip2.setSrc( src);
        bzip2.setDestfile(dest ); 
        bzip2.execute();
    }
  }
]]>
</scriptdef>

<bzip2-files>
    <fileset id="test" dir="upstream/classpath/jars/development">
            <include name="**/*.jar" />
    </fileset>
</bzip2-files>

संक्षिप्त जवाब

एक नेस्टेड <FileSet> साथ <foreach> उपयोग करें

Foreach ant-contrib आवश्यकता है।

हालिया चींटी-contrib के लिए अद्यतन उदाहरण:

<target name="foo">
  <foreach target="bar" param="theFile">
    <fileset dir="${server.src}" casesensitive="yes">
      <include name="**/*.java"/>
      <exclude name="**/*Test*"/>
    </fileset>
  </foreach>
</target>

<target name="bar">
  <echo message="${theFile}"/>
</target>

यह $ {theFile} के साथ लक्ष्य "बार" को वर्तमान फ़ाइल में परिणाम देगा।


टैसिलो हॉर्न द्वारा एंटी-कॉन्ट्रिब के बिना एक दृष्टिकोण का सुझाव दिया जाता है ( मूल लक्ष्य यहां है )

मूल रूप से, जैसा कि <java> (अभी तक?) का कोई विस्तार नहीं है, उसी तरह <लागू> <exec> विस्तारित करता है, वह <apply> का उपयोग करने का सुझाव देता है (जो निश्चित रूप से कमांड लाइन में जावा प्रोग्राम भी चला सकता है)

यहां कुछ उदाहरण दिए गए हैं:

  <apply executable="java"> 
    <arg value="-cp"/> 
    <arg pathref="classpath"/> 
    <arg value="-f"/> 
    <srcfile/> 
    <arg line="-o ${output.dir}"/> 

    <fileset dir="${input.dir}" includes="*.txt"/> 
  </apply> 

मुझे पता है कि यह पोस्ट वास्तव में पुरानी है लेकिन अब कुछ समय और चींटी संस्करण मूलभूत चींटी सुविधाओं के साथ ऐसा करने का एक तरीका है और मैंने सोचा कि मुझे इसे साझा करना चाहिए।

यह एक रिकर्सिव मैक्रोडेफ़ के माध्यम से किया जाता है जो नेस्टेड कार्यों को कॉल करता है (यहां तक ​​कि अन्य मैक्रोज़ भी कहा जा सकता है)। एकमात्र सम्मेलन एक निश्चित चर नाम (यहां तत्व) का उपयोग करना है।

<project name="iteration-test" default="execute" xmlns="antlib:org.apache.tools.ant" xmlns:if="ant:if" xmlns:unless="ant:unless">

    <macrodef name="iterate">
        <attribute name="list" />
        <element name="call" implicit="yes" />
        <sequential>
            <local name="element" />
            <local name="tail" />
            <local name="hasMoreElements" />
            <!-- unless to not get a error on empty lists -->
            <loadresource property="element" unless:blank="@{list}" >
                <concat>@{list}</concat>
                <filterchain>
                    <replaceregex pattern="([^;]*).*" replace="\1" />
                </filterchain>
            </loadresource>
            <!-- call the tasks that handle the element -->
            <call />

            <!-- recursion -->
            <condition property="hasMoreElements">
                <contains string="@{list}" substring=";" />
            </condition>

            <loadresource property="tail" if:true="${hasMoreElements}">
                <concat>@{list}</concat>
                <filterchain>
                    <replaceregex pattern="[^;]*;(.*)" replace="\1" />
                </filterchain>
            </loadresource>

            <iterate list="${tail}" if:true="${hasMoreElements}">
                <call />
            </iterate>
        </sequential>
    </macrodef>

    <target name="execute">
        <fileset id="artifacts.fs" dir="build/lib">
            <include name="*.jar" />
            <include name="*.war" />
        </fileset>

        <pathconvert refid="artifacts.fs" property="artifacts.str" />

        <echo message="$${artifacts.str}: ${artifacts.str}" />
        <!-- unless is required for empty lists to not call the enclosed tasks -->
        <iterate list="${artifacts.str}" unless:blank="${artifacts.str}">
            <echo message="I see:" />
            <echo message="${element}" />
        </iterate>
        <!-- local variable is now empty -->
        <echo message="${element}" />
    </target>
</project>

मुख्य विशेषताएं जहां आवश्यक हैं:

मैंने delimiter variabel बनाने के लिए प्रबंधन नहीं किया था, लेकिन यह एक बड़ा नकारात्मक पक्ष नहीं हो सकता है।


क्या करें blak3r ने आपके लक्ष्य क्लासपाथ का सुझाव दिया और परिभाषित किया

<taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
        <fileset dir="lib">
          <include name="**/*.jar"/>
        </fileset>
    </classpath>        
</taskdef>

जहां lib है जहां आप अपने जार स्टोर करते हैं


इसे आज़माएं यह आपकी सभी फाइल फ़ोल्डर या फ़ोल्डर के अंदर मिल जाएगी

import glob, os
os.chdir("H:\\wallpaper")# use whatever you directory 

#double\\ no single \

for file in glob.glob("**/*.psd", recursive = True):#your format
    print(file)




file-io ant build-process build-automation