Ant执行外部命令和脚本

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>

超时(毫秒)后自动终止进程。

每天前进一小步,就是一个新的高度!

作者:唐明

出处:/post/ant-exec

版权:本站使用"CC BY 4.0"创作共享协议,转载请在文章明显位置注明作者及出处。

关注微信公众号

DevOps持续交付公众号ID:devopscd