如何在Ant concat中保留文件顺序?

时间:2011-05-02 11:23:04

标签: ant

如何在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

5 个答案:

答案 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>

值得注意的事情:

  1. 目录在文件之前排序
  2. 首都来自小写
  3. 更新:如果您需要手动指定订单,则另一种选择:

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

创建定义订单的订单文件。然后,在您的构建文件中:

  1. 使用<copy>
  2. 将订单文件复制到目标文件
  3. 将您的文件连接到一个<concat>
  4. 的临时文件中
  5. 使用<loadfile>
  6. 将文件加载到属性中
  7. 使用<replace>
  8. 将这些文件中的文本插入目标文件

    示例订单文件 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" />