【问题标题】:Converting an Ant fileset to multiple apply args将 Ant 文件集转换为多个应用参数
【发布时间】:2010-01-27 16:03:44
【问题描述】:

我有一些文件:

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 不支持 fileset

【问题讨论】:

    标签: ant arguments fileset


    【解决方案1】:

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

    转换后的路径使用&lt;arg line /&gt; 传递给可执行文件。

    这假定您的 *.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}'"/>
    

    【讨论】:

    • 我认为不可能混合 但它似乎没问题。这是一个很好的解决方法,并且有效(我没有测试名称中包含空格的情况)。
    • Quote: 强烈建议尽可能避免使用 line 版本。 Ant 将尝试以类似于 (Unix) shell 的方式拆分命令行,但在某些情况下可能会创建与您期望的非常不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多