将Ant文件集转换为多个apply args

时间:2010-01-27 16:03:44

标签: ant arguments fileset

我有一些文件:

dir/foo.txt
dir/bar.txt
dir/foobar.txt

在Ant apply任务中,我想将文件列表作为参数传递:

<target name="atask">
    <apply executable="${cmd}" parallel="false" verbose="true">
        <arg value="-in"/>
        <srcfile/>
        <arg value="dir/foo.txt"/>
        <arg value="dir/bar.txt"/>
        <arg value="dir/foobar.txt"/>

        <fileset dir="${list.dir}" includes="*.list"/>
    </apply>
</target>

这很好,但如果我想使用文件集动态选择文件列表,那该怎么办:

<fileset dir="dir" includes="*.txt"/>

如何将此文件集转换为arg个元素 - 每个文件一个?类似的东西:

<arg>
    <fileset dir="dir" includes="*.txt"/>
</arg>

而不是

<arg value="dir/foo.txt"/>
<arg value="dir/bar.txt"/>
<arg value="dir/foobar.txt"/>

(此示例不起作用,因为 arg 不支持文件集

1 个答案:

答案 0 :(得分:27)

这是一个说明使用pathconvert任务的示例。

转换后的路径使用<arg line />传递给可执行文件。

假设*.txt文件的路径中没有空格。

<target name="atask">
    <fileset dir="dir" id="myTxts">
        <include name="*.txt" />
    </fileset>
    <pathconvert property="cmdTxts" refid="myTxts" pathsep=" " />

    <apply executable="${cmd}" parallel="false" verbose="true">
        <arg value="-in" />
        <srcfile />
        <arg line="${cmdTxts}" />

        <fileset dir="${list.dir}" includes="*.list" />
    </apply>
</target>

如果你可能遇到空格,这应该做:如上所述,但改变(希望明显哪些行):

    <pathconvert property="cmdTxts" refid="myTxts" pathsep="' '" />

        <arg line="'${cmdTxts}'"/>