有条件地重定向ant exec任务中的输出

时间:2012-03-08 13:00:47

标签: ant

有没有办法有条件地将输出重定向到属性或stdout流作为下面的非工作示例?

<macrodef name="mytask">
  <attribute name="output" default="STDOUT"/>
  <sequential>
      <exec executable="my.exe" outputproperty="@{output}"/>
  </sequential>
</macrodef>

上面的示例默认将输出重定向到属性STDOUT。相反,我希望它被定向到stdout流。

我可以创建mytask_with_stdout作为上述宏的副本并删除exec outputproperty,但这会违反DRY原则。

这有什么好办法吗?

1 个答案:

答案 0 :(得分:2)

您可以结合使用两种Ant功能来获得所需的功能。

首先,<macrodef>可以通过您想要的任何<element>

其次,<redirector>可用于捕获属性中<exec>命令的输出。

我在Windows机器上运行了以下Ant脚本,因此我可以使用cmd.exe的echo命令。将cmd.exe替换为my.exe:

<project name="exec-redirector-example" default="run">
    <macrodef name="mytask">
        <attribute name="message"/>
        <element name="myredirector" optional="true"/>
        <sequential>
            <exec executable="cmd.exe">
                <arg value="/c"/>
                <arg value="echo"/>
                <arg value="@{message}"/>
                <myredirector/>
            </exec>
        </sequential>
    </macrodef>

    <target name="run">
        <!-- exec outputs to STDOUT by default -->
        <mytask message="To STDOUT">
        </mytask>

        <!-- exec outputs to a property in this example -->
        <mytask message="To property">
            <myredirector>
                <redirector outputproperty="my.property"/>
            </myredirector>
        </mytask>

        <echo>${my.property}</echo>
    </target>
</project>