如何在Ant concat中保留文件顺序?
简单的concat with fileset& includesfile产生相当“随机”的顺序,因为订单无法保证:
<concat destfile="C:/targetdir/concatenated.file">
<fileset dir="C:/sourcedir/">
<includesfile name="C:/targetdir/includes.file" />
</fileset>
</concat>
我需要的是以特定顺序连接文件列在包含文件中。
到目前为止,我找到了资源列表,它应该保留顺序,但我似乎无法用它生成任何连接文件。 :/
<concat destfile="C:/targetdir/concatenated.file">
<resourcelist>
<file file="C:/targetdir/includes.file"/>
<filterchain>
<striplinecomments>
<comment value="#"/>
</striplinecomments>
<prefixlines prefix="C:/sourcedir/"/>
</filterchain>
</resourcelist>
</concat>
另外,资源列表似乎无法处理像
这样的行LibraryX/A/Stuff/Morestuff/*
相反,该行只会产生“...... / Morestuff / *不存在”。 -error
包含文件包含相对路径列表:
LibraryX/A/Stuff/FileA.txt
LibraryX/A/Stuff/FileB.txt
LibraryX/A/Stuff/FileC.txt
LibraryX/A/Stuff/FileY.txt
答案 0 :(得分:13)
我能够很容易地获得一份文件清单:
<concat destfile="C:/targetdir/concatenated.file">
<filelist dir="C:/sourcedir/">
<file name="i.txt" />
<file name="n.txt" />
<file name="o.txt" />
<file name="r.txt" />
<file name="d.txt" />
<file name="e.txt" />
<file name="r.txt" />
</filelist>
</concat>
希望有所帮助!
答案 1 :(得分:6)
如果您使用的是Ant 1.7+,则可以使用sort命令
<concat destfile="C:/targetdir/concatenated.file">
<sort>
<fileset dir="C:/sourcedir/">
<include name="C:/targetdir/*.file" />
</fileset>
</sort>
</concat>
您可以找到排序here
的文档答案 2 :(得分:2)
[On Ant 1.8.2+]您还可以通过排序传递文件集,并对文件名进行排序,如下所示:
<concat destfile="./${dir.publish}/${dir.js}/b.main-${build.number}.debug.js">
<sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators">
<fileset dir="./${dir.publish}/">
<include name="**/${dir.js.main}/**/*.js"/>
<exclude name="**/${dir.js.main}/**/*.min.js"/>
</fileset>
<rcmp:name />
</sort>
</concat>
值得注意的事情:
更新:如果您需要手动指定订单,则另一种选择:
<!-- create a ordered list of all the build files so that CIAPI & CIAPI.widget are built first
(can't find a smarter way to do this, since ant filesets are unordered) -->
<fileset id="a" dir="."><include name="CIAPI/build.project.xml"/></fileset>
<fileset id="b" dir="."><include name="CIAPI.widget/build.project.xml"/></fileset>
<fileset id="c" dir=".">
<include name="**/build.project.xml"/>
<exclude name="CIAPI/build.project.xml" />
<exclude name="CIAPI.widget/build.project.xml" />
</fileset>
<union id="all_build_files">
<fileset refid="a"/>
<fileset refid="b"/>
<fileset refid="c"/>
</union>
丑陋,但是,呃,这是蚂蚁?
答案 3 :(得分:0)
试试这个,按字母顺序排列
<project name="concatPath" default="full">
<target name="full">
<fileset id="fs" dir="./files" />
<pathconvert refid="fs" property="concatList" pathsep=";" targetos="unix"/>
<echo>${concatList}</echo>
</target>
</project>
这可以与目录的层次结构一起使用,顺序将由David公开。
答案 4 :(得分:0)
请记住,根据定义,XML不依赖于顺序。
要按排序顺序连接文件,请考虑改为使用<replace>
。
创建定义订单的订单文件。然后,在您的构建文件中:
<copy>
<concat>
<loadfile>
<replace>
示例订单文件 order_file.txt :
FILE_A_HERE
CONCAT_FILES_HERE
示例ant构建文件 build.xml :
<copy file="order_file.txt" tofile="destination.txt" overwrite="yes">
<concat destfile="tempfile.txt">
<fileset dir="includes/">
<include name="*.txt">
<exclude name="fileA.txt">
</fileset>
</concat>
<loadfile property="fileA" srcFile="includes/fileA.txt" />
<loadfile property="concatFile" srcFile="tempfile.txt" />
<replace file="destination.txt" token="FILE_A_HERE" value="fileA" />
<replace file="destination.txt" token="CONCAT_FILES_HERE" value="concatFile" />