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 文件加载文件列表
  • 将此文件列表连接在一起

如果是这种情况,您就没有理由制作自己的程序循环。您可以执行以下操作:

脚本.xml

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

构建.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 回答