如何以编程方式与ANT连接?

时间:2009-09-03 14:00:10

标签: ant build-process concatenation

让我先说一下我是蚂蚁的新手,如果重要的话,我正在使用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元素中,因为它经常被重用并且可能在原始文件中被更改,所以我想以编程方式迭代我文件中列出的脚本元素。

正确的语法是什么,或者我将如何实现这一目标?

3 个答案:

答案 0 :(得分: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>

是这样吗?

答案 1 :(得分:2)

这个解决方案正在使用Ant 1.8.1 - 我试图找出如何按特定顺序连接多个文件 - 而且似乎唯一的方法是使用文件列表。这就是我想出的:

给定一个包含文件名列表的文件:

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

file1.txt
file2.txt
file3.txt

将此文件加载到ant属性中并使用filterchain以“,”为行后缀,并删除所有换行符:

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

希望这有助于某人。

答案 2 :(得分: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>