Ant 可以通过 <exec>、<java>、<apply> 等任务调用外部程序,弥补 XML 表达能力有限的短板。
exec 执行系统命令
<!-- 执行简单命令 -->
<exec executable="git" outputproperty="git.version">
<arg value="--version" />
</exec>
<echo message="${git.version}" />
捕获输出
用 outputproperty 捕获标准输出:
<exec executable="svn" outputproperty="svn.info">
<arg line="info --show-item revision" />
</exec>
<echo message="当前版本:${svn.info}" />
指定工作目录
<exec executable="npm" dir="frontend/">
<arg value="install" />
</exec>
设置环境变量
<exec executable="python">
<env key="PYTHONPATH" value="${basedir}/lib" />
<env key="DEBUG" value="true" />
<arg line="build.py --output=${dist.dir}" />
</exec>
忽略失败
<exec executable="unknown-tool" failonerror="false" failifexecutionfails="false">
<arg value="--version" />
</exec>
failonerror="false":返回码非零不中断构建
failifexecutionfails="false":程序找不到也不报错
java 任务——在当前 JVM 中执行 Java 类
<java classname="com.example.Main" fork="true">
<classpath>
<pathelement location="build/classes/" />
<fileset dir="lib/" includes="*.jar" />
</classpath>
<arg value="--input=${input.file}" />
<arg value="--output=${output.dir}" />
</java>
fork="true" 表示在新 JVM 中运行,避免影响当前构建进程。
apply 批量执行
对一组文件依次执行某个命令:
<!-- 对所有 .proto 文件执行 protoc 编译 -->
<apply executable="protoc" dest="generated/">
<arg value="--java_out=." />
<fileset dir="proto/">
<include name="**/*.proto" />
</fileset>
<srcfile />
</apply>
<srcfile /> 会在命令末尾自动追加每个匹配文件的路径。
传递 Ant 属性到脚本
<exec executable="deploy.sh">
<arg value="${deploy.server}" />
<arg value="${deploy.path}" />
<arg value="${app.version}" />
</exec>
超时控制
<exec executable="long-running-tool" timeout="60000">
<arg value="--full-build" />
</exec>
超时(毫秒)后自动终止进程。
每天前进一小步,就是一个新的高度!