代码之家  ›  专栏  ›  技术社区  ›  Keith Bentrup

如何以编程方式连接ANT?

  •  2
  • Keith Bentrup  · 技术社区  · 16 年前

    让我先说一句,我是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元素中,因为它是重复使用的,并且可能会在原始文件中经常更改,所以我希望通过编程迭代文件中列出的脚本元素。

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   Jon W    16 年前

    • 从另一个xml文件加载文件列表
    • 将此文件列表合并在一起

    如果是这样的话,你就没有理由做你自己的程序循环。您可以执行以下操作:

    scripts.xml

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

    <xmlproperty file="scripts.xml" collapseAttributes="true" />
    <concat destfile="${out}" fixlastline="yes" eol="lf">
        <filelist files="${scripts.src}"/>
    </concat>
    

        2
  •  2
  •   rayd    15 年前

    这个解决方案使用的是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>
    

    希望这对别人有帮助。

        3
  •  1
  •   Göran Engdahl    15 年前

    像这样的东西可能有用(没有尝试过)

    <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>
    
    推荐文章