2012-08-07 41 views
10

我只使用apache-ant基於變量的值EXEC任務不ant-contrib參數傳遞給Apache的螞蟻

我有一個ant目標

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

中,我想調用exec任務。

如果一個變量HOST_NAMEall

<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_NAMEanything 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

回答

6

嘗試使用macrodef。以下示例未經測試。

<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> 
10

您可以使用條件任務:

<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

非常有益的,嘗試了一千種不同的變化,這是最後做了什麼訣竅。 – 2014-04-07 22:55:56

+0

這是偉大而緊湊的。我用它來根據構建參數有條件地生成代碼覆蓋率報告。 – 2014-08-27 19:42:23