2012-09-20 63 views
7

我想從我的NAnt腳本中調用某個EXE,並在屬性存在的情況下將屬性作爲參數傳遞,否則不傳遞任何東西。如何根據屬性存在條件將參數傳遞給NAnt exec任務?

下面的代碼似乎符合只是這種情況下,但它不工作:

<exec program="notepad.exe"> 
    <arg line="${file}" if="${property::exists('file')}" /> 
</exec> 

它扔Property 'file' has not been set錯誤。看起來它會評估忽略條件的屬性。如果條件是false,我希望它忽略整個<arg>元素。

如果我定義該塊上面的屬性,它顯然工作正常(即使屬性爲空)。如果是單個案例,這可能是值得的解決方法,但我必須以同樣的方式傳遞一些屬性。此外,<if>不是<exec>下的有效元素...

如何實現此目的?有任何想法嗎?

回答

7

我DAG出an old thread at NAnt mailing list,這實際上提供了最好的建議的解決方法,(我的情況)。這是基於<property>任務按預期工作的事實。解決方法根據原始屬性是否已定義引入額外的屬性進行設置。

像這樣:

<target name="example"> 
    <property name="arg.value" value="${arg}" if="${property::exists('arg')}" /> 
    <property name="arg.value" value="" unless="${property::exists('arg')}" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

在我的情況下,它被證明是更容易始終設置默認值的屬性,甚至不引入額外的屬性 - 只是原來的財產傳給<arg/>

<target name="example"> 
    <property name="arg.value" value="default value" overwrite="false" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

它可以(而且將會)在其他包含文件中被覆蓋。

我也發現了another thread where the same question was asked,並且涉及到NAnt開發的人員建議說明人們是否對修補程序感興趣,以便修復此問題以適應<arg>元素。據我所知,沒有人表現出興趣:),因此行爲沒有改變。

我花了一點時間來研究一個修復程序可能是什麼,看來它只是關於將ExpandProperties=false添加到TaskAttribute的例如。 <arg>任務的line屬性。對於<property value="...">屬性,它的作用與預期相同。儘管我沒有嘗試過 - 如果我還有更多時間在這些日子裏,我會在這裏發佈更新。

+0

您可以選擇設置您正在閱讀的相同變量的默認值。這似乎更清楚,而是一個單一的聲明。 BradLaney

+0

根據你的用例,你的意思是你的第二個代碼片段的以下內容?

0

對於這種情況,您可以使用文件集作爲參數傳遞。默認情況下,文件集不包含與磁盤上的實際文件不匹配的項目。

+0

感謝您的建議。不幸的是,這不僅僅是關於文件 - 它只是一個示例。我必須通過大量各種性質的論證。我將在一個答案中塑造我最終的結果。 –

0

我也遇到過這個問題(老實說甚至不止一次)。在某些情況下,if屬性無法按照您的預期工作。這是我的醜陋的解決方法:

<choose> 
    <when test="${property::exists('file')}"> 
    <exec program="notepad.exe"> 
     <arg line="${file}" /> 
    </exec> 
    </when> 
    <otherwise> 
    <exec program="notepad.exe" /> 
    </otherwise> 
</choose> 
+0

感謝您的建議。那麼,這對於1個參數是有道理的 - 但我必須通過大量的參數。我將在一個答案中塑造我最終的結果。 –

相關問題