如何有条件地设置exec任务的arg值?

ser*_*ers 8 ant if-statement

我有一个我应该修改的ant构建脚本.具体来说,我应该进行subversion checkout条件:当前只有trunk被检出,新版本应该在需要时检查给定的分支.

<target name="do-svn-checkout" depends="init"
    <property name="branch" value=""/>
  <exec executable="svn">
    <arg value="checkout"/>
    <arg value="-r"/>
    <arg value="HEAD"/>
    <arg value="http://t01/java/trunk"/>
    <arg value="zzz"/>
    <arg value="--password"/>
    <arg value="xxx"/>
    <arg value="--username"/>
    <arg value="yyy"/>
  </exec>
</target>
Run Code Online (Sandbox Code Playgroud)

该属性branch将通过命令行设置,例如-Dbranch=mybranch.

如果属性branch为空,则应检出主干,但如果属性具有任何其他值,则应检出相应的分支,如http://t01/svn/hlfg/HLFG/java/branch/the-value-of-the-property.因此,根据属性,svn应修改调用的相应arg值.

是否可以使用基本Ant解决此问题,还是需要使用内联脚本?

Reb*_*bse 11

当使用Ant> = 1.9.3时,使用Ant 1.9.1引入的新的if/unless功能是一块蛋糕 (但是你应该至少使用Ant 1.9.3,因为Ant 1.9.1中存在bug,请参阅此答案细节)

不要忘记激活该功能的命名空间,fe:

<project
  xmlns:if="ant:if"
  xmlns:unless="ant:unless"
>

 <property name="foobar" value=" "/>

 <echo if:blank="${foobar}">foobar blank !</echo>
 <echo unless:blank="${foobar}">foobar not blank !</echo>

</project>
Run Code Online (Sandbox Code Playgroud)

在你的情况下像:

<target name="do-svn-checkout" depends="init"
 <property name="branch" value=""/>
 <exec executable="svn">
   <arg value="checkout"/>
   <arg value="-r"/>
   <arg value="HEAD"/>
   <arg value="http://t01/java/trunk" if:blank="${branch}">
   <arg value=".." unless:blank="${branch}">
   <arg value="zzz"/>
   <arg value="--password"/>
   <arg value="xxx"/>
   <arg value="--username"/>
   <arg value="yyy"/>
 </exec>
</target>
Run Code Online (Sandbox Code Playgroud)


sud*_*ode 1

您可以定义一个包装器目标,它依赖于其他两个目标 - 其中一个执行主干检出,另一个执行分支检出 - 并且每个目标都以可选分支属性的存在为条件。

您可以进一步将 exec 调用抽象为向其传递主干或分支 url 的宏定义。

例如:

<project name="test" default="do-svn-checkout">

    <target name="do-svn-checkout" depends="do-svn-trunk-checkout, do-svn-branch-checkout"/>

    <target name="do-svn-trunk-checkout" unless="branch">
        <svn-checkout svn-url="http://t01/svn/java/trunk"/>
    </target>

    <target name="do-svn-branch-checkout" if="branch">
        <svn-checkout svn-url="http://t01/svn/hlfg/HLFG/java/branch/${branch}"/>
    </target>

    <macrodef name="svn-checkout">
        <attribute name="svn-url"/>
        <sequential>
            <echo message="svn-url=@{svn-url}"/>
        </sequential>
    </macrodef>

</project>
Run Code Online (Sandbox Code Playgroud)

未定义分支属性的输出:

do-svn-trunk-checkout:
     [echo] svn-url=http://t01/svn/java/trunk

do-svn-branch-checkout:

do-svn-checkout:
Run Code Online (Sandbox Code Playgroud)

定义了分支属性的输出:

do-svn-trunk-checkout:

do-svn-branch-checkout:
     [echo] svn-url=http://t01/svn/hlfg/HLFG/java/branch/mybranch

do-svn-checkout:
Run Code Online (Sandbox Code Playgroud)