有没有办法有条件地将输出重定向到属性或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原则。
这有什么好办法吗?
答案 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>