是否有一种方法可以有条件地将输出重定向到属性或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原则。
有什么好方法吗?
有两个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>