让我先说一下我是蚂蚁的新手,如果重要的话,我正在使用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元素中,因为它经常被重用并且可能在原始文件中被更改,所以我想以编程方式迭代我文件中列出的脚本元素。
正确的语法是什么,或者我将如何实现这一目标?
答案 0 :(得分:5)
我认为您的要求是:
如果是这种情况,那么你没有理由做出自己的程序循环。你可以这样做:
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>