3

我有一個ant任務使用apply任務在一組文件上運行腳本。將可選路徑參數傳遞給螞蟻

我有這樣的目錄結構產生: mkdir -p a/{b,c,d,e}/f

通常情況下(如果我通過沒有參數),我想螞蟻在所有f的磨合。 也就是說,如果我打電話給ant mytask,它應該處理:a/b/f, a/c/f, a/d/f, a/e/f。這已經可以使用apply和patternsets。

但是,當我向它傳遞一個名爲foo的可選參數時,它應該只調用a/foo/f上的腳本。

所以如果我打電話ant mytask -foo b,它應該只處理a/b/f,而不是其他處理。

我讀過this SO post,它解釋了傳遞參數的方法,並且我查看了關於propertiesconditionals的ant文檔。但我仍然無法以有效的方式將它們拼湊在一起。

而且,我不希望使用的建議,一個從SO高於此呼籲這樣的論點:

<arg value="${arg0}"/> 
<arg value="${arg1}"/> 

我希望能夠稱其爲ant mytask -foo valueoffoo的任意foo

謝謝。


我想馬丁·克萊頓的建議之下,並有這樣的代碼:

<target name="mytask"> 
    <property name="foo" value="*" /> 
    <apply executable="perl"> 
    <arg value="somescript"/> 
    <dirset id="them" dir="a"> 
     <include name="${foo}/*/f" /> 
    </dirset> 
    </apply> 
</target> 

以上我想要做什麼。

注意1:在我的實際代碼中,我使用的是模式集而不是dirset,但它應該可以工作。

注2:在我原來的問題中,我說的目錄結構是a/{b,c,d,e}/f。它實際上有點複雜,因此在上面的包括*。我第一次忽略它,因爲它看起來不相關。

+0

我不知道我下面這個 - 你的榜樣Ant命令行中提到的目標'mytask'和任意'foo',但你的樣本構建文件是一個名爲foo的目標是什麼?你是否需要通過一個任意的子路徑?或者它只是一個任意的目錄級別? –

+0

@馬丁·克萊頓:噢,對不起,你是正確的,是混亂的。我解決了我的問題。 – yarian

+0

因此,默認情況下,include模式是'*/*/f' - 您希望能夠從命令行覆蓋哪些部分? '$ {foo}'部分或者中間''''或者兩者都可能? –

回答

2

雖然命令行語法略有不同,但您可以這樣做 - 使用屬性'override'的 。

首先,在構建文件,構建你的文件集或dirset從屬性foo, 是這樣的:

<property name="foo" value="*" /> 
<dirset id="them" dir="a"> 
    <include name="${foo}/f" /> 
</dirset> 

這會給你的默認行爲 - 處理的a所有 子目錄本身具有子目錄f

現在,如果你喜歡這個運行Ant:

ant -Dfoo=d 

只有目錄a/d/f將被處理。

這是可行的,因爲Ant屬性是不可變的 - 好吧,通常也不是 - 因此foo的命令行定義阻止了使用構建文件中的那個。

+0

見上面我編輯的問題。 – yarian