পিঁপড়া: ডিরেক্টরিতে প্রতিটি ফাইলের জন্য একটি কমান্ড কার্যকর করতে?


97

আমি ডিরেক্টরিতে প্রতিটি ফাইলের জন্য একটি পিঁপড়া বিল্ডফিল থেকে একটি কমান্ড কার্যকর করতে চাই।
আমি প্ল্যাটফর্ম-স্বতন্ত্র সমাধানের সন্ধান করছি।

আমি এটা কিভাবে করবো?

অবশ্যই, আমি কিছু স্ক্রিপ্টিং ভাষায় একটি স্ক্রিপ্ট লিখতে পারি, তবে এটি প্রকল্পে আরও নির্ভরতা যুক্ত করবে।

উত্তর:


61

সংক্ষিপ্ত উত্তর

<foreach>একটি নেস্টেড সঙ্গে ব্যবহার করুন<FileSet>

ফরচের পিঁপড়া- অবদানের প্রয়োজন ।

সাম্প্রতিক পিঁপড়া-অবদানের জন্য আপডেট হওয়া উদাহরণ:

<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>

এটি বর্তমান ফাইলের ফলে bar {FFile with এর সাথে লক্ষ্য "বার" এন্টিক্যাল করবে।


তো, আমাকে কিছু অন্তর্ভুক্ত করতে হবে? বা আমার কিছু বাহ্যিক পিঁপড়া লেব দরকার? আমি "সমস্যা: টাস্ক তৈরি করতে বা ফোরচ টাইপ করতে ব্যর্থ" পেয়েছি । যদি আমি সঠিকভাবে বুঝতে পারি তবে এর অর্থ, foreach একটি অজানা কীওয়ার্ড।
ivan_ivanovich_ivanoff

4
ওহ লম্পট ... এটি একটি পিঁপড়া-অবদানের কাজ। সুতরাং, আপনাকে কিছু ইনস্টল করতে হবে। এখানে দেখুন: ant-contrib.sourceforge.net
blak3r

4
পিঁপড়া-অবদানের অন্তর্ভুক্ত হওয়ার আগে সেই উদাহরণটি একটি ভবিষ্যদ্বাণী থেকে নেওয়া। একটা ভাল উদাহরণ আছে ant.1045680.n5.nabble.com/Using-foreach-td1354624.html আমি কাজ উদাহরণস্বরূপ আপডেট করতে যাচ্ছি।
শান

4
নেস্টেড ফাইলসেট উপাদানটি ত্রুটিযুক্ত করা হয়েছে, পরিবর্তে নেস্টেড পাথটি ব্যবহার করুন
ডুড

@dude ব্যবহারের <foreach> <পাথ> <fileset> <নাম অন্তর্ভুক্ত = "* বয়াম।" /> </ fileset> </ পাথ> </ foreach>
শরৎ

88

<অ্যাপ্লিকেশন> টাস্কটি ব্যবহার করুন ।

এটি প্রতিটি ফাইলের জন্য একবার কমান্ড কার্যকর করে। ফাইলসেট বা অন্য কোনও সংস্থার মাধ্যমে ফাইলগুলি নির্দিষ্ট করুন। <অ্যাপ্লিকেশন> অন্তর্নির্মিত; কোন অতিরিক্ত নির্ভরতা প্রয়োজন; কোন কাস্টম টাস্ক বাস্তবায়ন প্রয়োজন।

একবারে সমস্ত ফাইল যুক্তি হিসাবে যুক্ত করে কমান্ডটি একবার চালানোও সম্ভব। আচরণটি পরিবর্তন করতে সমান্তরাল বৈশিষ্ট্যটি ব্যবহার করুন।

এক বছর দেরী হওয়ার জন্য দুঃখিত


4
আমি ঠিক এই 2011 সালে দরকারী খুঁজে পেয়েছি, যাইহোক যাইহোক এটির জন্য ধন্যবাদ!
মাইকেল ডেলা বিট্ট

7
<apply> এর সমস্যাটি হ'ল এটি কেবল বাহ্যিক সিস্টেম কমান্ডগুলি কার্যকর করে। এটি সরাসরি কোনও অ্যান্টি স্টাফ করবে না। এটিই মূল প্রশ্নটি সম্পর্কে ছিল কিনা তা পরিষ্কার নয়। মূলত আপনাকে দুটি অ্যাপ্লিকেশনটির জন্য <অ্যাপ্লিকেশন> বা <ফরাসী >> ব্যবহার করতে হবে ... যা সম্পূর্ণ বোবা।
আরচি

27

পিঁপড়া-অবদান ছাড়াই একটি পদ্ধতির পরামর্শ টিসিলো হর্ন ( মূল লক্ষ্যটি এখানে )

Basicly, যেহেতু কোন এক্সটেনশান <জাভা> (এখনও?) একই ভাবে যে <আবেদন> প্রসারিত <Exec> তিনি ব্যবহার তার পরামর্শ <আবেদন> (যা অবশ্যই একটি কমান্ড লাইনে জাভা প্রোগ্রাম চালাতে পারে)

এখানে কয়েকটি উদাহরণ:

  <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> 

4
মূল প্রশ্নে এটি স্পষ্টভাবে প্রয়োজন হলেও এটি খুব প্ল্যাটফর্মটি স্বাধীন নয় ...
চকি

18

জাভাস্ক্রিপ্ট এবং পিপীলিকার স্ক্রিপ্টডিফ টাস্কটি ব্যবহার করে এখানে এটি করার উপায়, এই কোডটির জন্য আপনার পিপড়া-অবদানের প্রয়োজন নেই যেহেতু স্ক্রিপ্টডেফ একটি মূল পিঁপড়া কাজ।

<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>

projectউপরের উদাহরণে একটি ভেরিয়েবল উল্লেখ করা হয়েছে, তবে পূর্বের কোনও সংজ্ঞা উপলব্ধ নেই। এটি উপস্থাপন করা বা স্পষ্ট করা ভাল হবে। সম্পাদনা: এন / মি, এটি projectবর্তমান প্রকল্প অ্যাক্সেসের জন্য পূর্বনির্ধারিত ভার var আমি সন্দেহ করেছি, তবে নিশ্চিত ছিল না।
জন এল।

4
জেডিকে 8 বা তার পরে যারা এটি চেষ্টা করছে তাদের জন্য, মনে রাখবেন যে জেআরই দ্বারা লোড হওয়া স্ক্রিপ্টইঞ্জাইন যদি গণ্ডার হয় (যা বেশিরভাগ জেডিকে 6 এবং 7 এর জন্য সত্য ছিল) তবে ন্যাশর্নে (8 পরবর্তী থেকে) আপনি এটি ব্যবহার করতে পারেন পশ্চাদপদ-সামঞ্জস্যপূর্ণ "ফাইল = java.io.File" বা নতুন তবে পশ্চাদপটে সামঞ্জস্যপূর্ণ জাভা.টাইপ নয়। স্ক্রিপ্টডেফ চলমান সমস্যা থাকাতে পিপীলিকা নিঃশব্দে ব্যর্থ বলে মনে হয়, যেমনটি আমি আজ অভিজ্ঞতা লাভ করেছি।
মাত্তেও স্টেকোলিনি

16

পিপড়া-অবদান মন্দ; একটি কাস্টম পিঁপড়া টাস্ক লিখুন।

পিপড়া-অবদানটি খারাপ কারণ এটি একটি ঘোষিত শৈলীর থেকে পিপাসাকে একটি অপরিহার্য শৈলীতে রূপান্তরিত করার চেষ্টা করে। তবে এক্সএমএল একটি বোকা প্রোগ্রামিং ভাষা তৈরি করে।

বিপরীতে একটি কাস্টম পিঁপড়া টাস্ক আপনাকে সত্যিকারের আইডিই সহ একটি বাস্তব ভাষায় (জাভা) লিখতে দেয়, যেখানে আপনি নিজের পছন্দমতো আচরণটি নিশ্চিত করতে ইউনিট পরীক্ষা লিখতে পারেন এবং তারপরে আপনার বিল্ড স্ক্রিপ্টে একটি পরিষ্কার ঘোষণা করতে পারেন আপনি চান আচরণ

আপনি যদি রক্ষণাবেক্ষণযোগ্য পিঁপড়া স্ক্রিপ্ট লেখার বিষয়ে চিন্তা করেন তবেই এই রেন্টটি গুরুত্বপূর্ণ। আপনি যদি সব উপায়ে রক্ষণাবেক্ষণের বিষয়ে চিন্তা না করেন তবে যা কাজ করে তা করুন। :)

জেটিএফ


4
আপনার কথা ঠিক আছে, জাভাতে আমার কেবল কাস্টম পিঁপড়া টাস্কটি লেখা উচিত;)
ivan_ivanovich_ivanoff

4
পিপড়া-অবদান সত্যিই খারাপ। এই মুহুর্তে আমি একটি বৃহত পিঁপড়া বিল্ড প্রকল্পের মাঝখানে আছি যা যদি / তারপরে / অন্যটি এবং অ্যান্টকোলগুলির তীব্র ব্যবহার করে এবং এটি সত্যিই ভয়ঙ্করভাবে পড়ে। পুরো জিনিসটি রূপান্তরিত ব্যাচ / শেল স্ক্রিপ্টের মতো দেখায় এবং পিঁপড়ায় করে এমন সমস্ত নির্ভরতা স্টাফ পুরোপুরি পিপীলিকার অবদানের ভারী ব্যবহার দ্বারা বন্ধ হয়ে যায়। আপনি যদি নিজের সেটআপটি পরিষ্কার রাখতে চান তবে নিজের কাজটি তৈরি করুন। : - /
ক্রিঞ্জ

4
@ ক্রিং, আমি একমত নই যে কোনও কিছুর মতোই, আপনাকে জানতে হবে কখন পিঁপড়া-অবদান ব্যবহার করা আপনার পক্ষে ভাল। If এবং var এর মতো জিনিস থেকে দূরে থাকুন এবং চাকাটিকে পুনরায় উদ্ভাবন করতে এড়াতে পিঁপড়া-অবদান ব্যবহার করুন।
নীল

4
এবং একটি স্ক্রিপ্টিং ভাষা হওয়া উচিত, তাই আবশ্যক এবং ঘোষণামূলক না, দিয়ে শুরু করা। সুতরাং এটি এবং কে মন্দ আইএমও
mvmn

হতে পারে পিপড়া-অবদান একটি অগ্রাধিকারজনক মন্দ তবে ব্ল্যাক 3 র এর ব্যবহার যুক্তিসঙ্গত এবং পিপড়া-ইশ বলে মনে হচ্ছে, তাই বলে।
ssimm

7

আমি জানি এই পোস্টটি সত্যই পুরানো তবে এখন কিছু সময় এবং পিঁপড়ার সংস্করণগুলি কেটে গেছে বেসিক পিঁপড়া বৈশিষ্ট্যগুলি সহ এটি করার একটি উপায় এবং আমি ভেবেছিলাম আমার এটি ভাগ করা উচিত।

এটি একটি পুনরাবৃত্তির ম্যাক্রোডেফের মাধ্যমে সম্পন্ন হয়েছে যা নেস্টেড টাস্কগুলিকে কল করে (এমনকি অন্যান্য ম্যাক্রোও ডাকা হতে পারে)। একমাত্র কনভেনশন হ'ল একটি স্থির পরিবর্তনশীল নাম (এখানে উপাদানটি) ব্যবহার করা।

<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>

মূল বৈশিষ্ট্যগুলি যেখানে প্রয়োজন:

আমি ডিলিমিটার ভেরিয়েবল তৈরি করতে পারি নি, তবে এটি কোনও বড় নেতিবাচক নাও হতে পারে।


দুর্ভাগ্যক্রমে এটি স্মৃতি থেকে বেরিয়ে যায় এবং দ্রুত গতিতে ফুরিয়ে যায়।
ডেভিড সেন্ট ডেনিস

হ্যাঁ এটি আপনার স্ট্যাকটিকে উড়িয়ে দিতে পারে, আপনার প্রক্রিয়া করা ফাইলগুলির সংখ্যার উপর নির্ভর করে। আমি প্রায় 66 টি ফাইল (বর্ধিত মেমোরি বিকল্প ছাড়াই) দিয়ে এটি বেশ সফল করেছি। তবে এটি কেবলমাত্র একটি বিকল্প কারণ যদি আপনার পিঁপড়া-অবদানের অ্যাক্সেস না পান যা আরও কার্যকারিতা প্রস্তাব করে (যেমন সমান্তরালভাবে চলমান)।
দাগ

এটি খুব সহায়ক ছিল।
ডায়মন্ড্রেক

0

আপনি পিঁপড়া-অবদানকারী টাস্কটি "কোনও" জন্য কোনও ডেলিমিটার দ্বারা পৃথক পৃথক ফাইলের তালিকায় পুনরাবৃত্তি করতে ব্যবহার করতে পারেন, ডিফল্ট ডেলিমিটারটি "," হয়।

নীচে নমুনা ফাইল যা এটি দেখায়:

<project name="modify-files" default="main" basedir=".">
    <taskdef resource="net/sf/antcontrib/antlib.xml"/>
    <target name="main">
        <for list="FileA,FileB,FileC,FileD,FileE" param="file">
          <sequential>
            <echo>Updating file: @{file}</echo>
            <!-- Do something with file here -->
          </sequential>
        </for>                         
    </target>
</project>

0

ব্লেক 3 ইয়ার যা বলেছিল তা করুন এবং আপনার টার্গেটগুলি ক্লাসপাথের মতো সংজ্ঞায়িত করুন

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

যেখানে লিব যেখানে আপনি আপনার জারের স্টোর

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.