【问题标题】:pass arguments to apache-ant exec task based on the variable's value根据变量的值将参数传递给 apache-ant exec 任务
【发布时间】:2012-08-07 06:17:45
【问题描述】:

我只使用apache-ant不是 ant-contrib

我有一个ant 目标

<target name="stop" depends="init" >
...
</target>

我想在其中调用exec 任务。

如果变量HOST_NAME的值为all

<exec executable="${executeSSH.shell}" >
    <arg value="-h ${HOST_NAME}" />
    <arg value="-i ${INSTANCE}" />
    <arg value="-w 10" />
    <arg value="-e ${myOperation.shell} " />
    <arg value=" -- " />
    <arg value="${INSTANCE} ${USERNAME} ${PASSWORD}" />
</exec>

如果变量HOST_NAME的值为anything else

<exec executable="${executeSSH.shell}">
    <arg value="-h ${HOST_NAME}" />
    <arg value="-i ${INSTANCE}" />
    <arg value="-e ${myOperation.shell} " />
    <arg value=" -- " />
    <arg value="${INSTANCE} ${USERNAME} ${PASSWORD}" />
</exec>

但我只想写一个任务,不再重复exec。我已经使用了HOST_NAME 参数,但是第二个参数-w 10 在两个调用中都不同。

我通过使用conditionif else 搜索SO 尝试了几种方法,但似乎没有任何方法适用于execarg

【问题讨论】:

    标签: apache ant if-statement exec


    【解决方案1】:

    你可以使用条件任务:

    <condition property="my.optional.arg" value="-w 10" else="">
        <equals arg1="${HOST_NAME}" arg2="all" />
    </condition>
    
    <exec executable="${executeSSH.shell}" >
        <arg value="-h ${HOST_NAME}" />
        <arg value="-i ${INSTANCE}" />
        <arg line="${my.optional.arg}" />
        <arg value="-e ${myOperation.shell} " />
        <arg value=" -- " />
        <arg value="${INSTANCE} ${USERNAME} ${PASSWORD}" />
    </exec>
    

    【讨论】:

    • 非常有帮助,尝试了上千种不同的变体,终于成功了。
    • 这很棒而且很紧凑。我用它根据构建参数有条件地生成代码覆盖率报告。
    【解决方案2】:

    尝试使用宏定义。以下示例未经测试。

    <macrodef name="callSSH">
        <element name="extArgs" optional="y"/>
        <sequential>
            <exec executable="${executeSSH.shell}" >
                <arg value="-h ${HOST_NAME}" />
                <arg value="-i ${INSTANCE}" />
                <extArgs/>
                <arg value="-e ${myOperation.shell} " />
                <arg value=" -- " />
                <arg value="${INSTANCE} ${USERNAME} ${PASSWORD}" />
            </exec>
        </sequential>
    </macrodef> 
    <target name="stop" depends="init" >
        <if>
           <equals arg1="${HOST_NAME}" arg2="all"/>
            <then>
                <callSSH>
                    <extArgs>
                        <arg value="-w 10" />
                    </extArgs>
                </callSSH>
            </then>
            <else>
                <callSSH>
                    <extArgs/>
                </callSSH>
            </else>
        </if>
    </target>
    

    或者如果你不使用贡献:

    <target name="sshExecWithHost" if="HOST_NAME"> 
        <callSSH>
            <extArgs>
                <arg value="-w 10" />
            </extArgs>
        </callSSH>
    </target>
    
    <target name="sshExecNoHost" unless="HOST_NAME">
        <callSSH/>
    </target>
    
    <target name="sshSwitch" depends="sshExecNoHost,sshExecWithHost">
    </target>
    
    <target name="stop" depends="init,sshSwitch" >
    </target>
    

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多