3

はじめに、私は ant を初めて使用し、問題があればバージョン 1.6.5 を使用していると言っておきましょう。

連結したいファイルのリストを含むファイルがあります。私の最初の試みの関連部分はこれでした:

<target name="for-each">
    <xmlproperty file="scripts.xml" collapseAttributes="true" />
    <echo message="testing for-each"/>
    <concat destfile="${out}" fixlastline="yes" eol="lf">
        <foreach list="${scripts.src}" target="loop" param="var" delimiter=","/>
    </concat>
</target>

<target name="loop">
    <echo message="File :: ${var}"/>
    <fileset file="${SRC_DIR}${var}" />
</target>

ただし、concat は foreach 要素をサポートしていません。

ファイルセットは再利用され、元のファイルで頻繁に変更される可能性があるため、単純にファイルセットを切り取って concat 要素に貼り付けたいわけではありません。代わりに、ファイルにリストされているスクリプト要素をプログラムで反復処理したいと考えています。

正しい構文は何ですか、またはこれをどのように達成しますか?

4

3 に答える 3

5

あなたの要件は次のとおりだと思います。

  • 別のxmlファイルからファイルリストをロードします
  • このファイルリストを連結する

その場合、独自の手続き型ループを作成する必要はありません。次のようなことができます:

scripts.xml

<scripts>
   <src>file1</src>
   <src>file2</src>
</scripts>

build.xml

<xmlproperty file="scripts.xml" collapseAttributes="true" />
<concat destfile="${out}" fixlastline="yes" eol="lf">
    <filelist files="${scripts.src}"/>
</concat>

これは本当ですか?

于 2009-09-03T14:24:43.203 に答える
2

このソリューションは Ant 1.8.1 を使用しています -- 特定の順序で多数のファイルを連結する方法を見つけようとしていました -- そして、これを行う唯一の方法はファイルリストを使用することであると思われました。これが私が思いついたものです:

ファイル名のリストを含むファイルが与えられた場合:

files.list:
-------------

file1.txt
file2.txt
file3.txt

このファイルを ant プロパティにロードし、フィルターチェーンを使用して行の末尾に ", " を付け、改行を削除します。

<!-- put list in format for filelist element -->
<loadfile property="file.includes" srcFile="files.list">
    <filterchain>
        <suffixlines suffix=", "/>
        <striplinebreaks/>
    </filterchain>
</loadfile>

これにより、次の値が ${file.includes} プロパティに設定されます: "file1.txt, file2.txt, file3.txt,"。この文字列は現在、filelist 要素で使用する正しい形式になっているため、filelist と ${file.includes} プロパティを使用して連結できます。

<concat destfile="${dest.file}" fixlastline="yes">
    <filelist dir="${basedir}" files="${file.includes}"/>
</concat>

これが誰かに役立つことを願っています。

于 2010-10-20T16:02:35.493 に答える
1

このようなものがうまくいくかもしれません(試していません)

<foreach param="file" list="${files}" target="concat_one_file" inheritall="true"/>

  <target name="concat_one_file">
    <do_concat source="${file}" destination="destination.txt"/>
  </target>


  <macrodef name="do_concat">
    <attribute name="source"/>
    <attribute name="destination"/>
    <sequential>
      <concat destfile="@{destination}" append="yes">
        <fileset file="@{source}" />
      </concat>
    </sequential>
  </macrodef>
于 2010-09-09T18:19:15.403 に答える