2012-09-14 43 views
2

我覺得這可以用一個例子來簡單解釋,所以這裏有雲:爲什麼ANT在創建文件集後更新文件集的內容,我可以覆蓋它嗎?

<target name="test"> 
    <fileset id="fileset" dir="target"> 
     <include name="*"/> 
    </fileset> 
    <echo>${toString:fileset}</echo> 
    <touch file="target/test"/> 
    <echo>${toString:fileset}</echo> 
</target> 

輸出:

test: 
    [echo] 
    [touch] Creating target/test 
    [echo] test 

我非常希望的是將文件集保持不變,所以我可以有一個之前/之後設置(爲了使用<difference>獲得更改的設置,所以如果您知道一種方法可以跳到那個...)。

我試過使用<filelist>來代替,但我無法在<difference>任務中正確填充和比較它們(因爲我似乎無法輸出它們的內容,所以它們也很難調試)。我也嘗試使用<modified/>來選擇文件集中的文件,但它似乎根本不起作用,始終沒有任何迴應。

即使有其他方法,我也希望更好地理解ANT在上面的例子中做了什麼以及爲什麼。

回答

2

路徑選擇器在運行中進行評估。當一個文件被添加時,它會反映在你使用它的集合。

您可以使用pathconvert進行評估並將其保存在變量中。那麼這個可以改回使用pathtofilest

+0

將其轉換回一個文件集對我而言是無用的,但是由於pathconvert將它存儲爲一個字符串屬性,因此可以很容易地創建文件列表,然後我可以在''任務中使用該文件列表。謝謝。 – Thor84no

+0

@ Thor84no:你可以發佈你的最終代碼作爲答案! – Jayan

+0

這是一個很好的觀點。 – Thor84no

2

文件集就像一個選擇器。這是一組允許獲取一組文件的「指令」(包含,排除,模式)。

每次您實際上對文件集執行某些操作(如打印文件「引用」)時,實際文件集將根據文件集中包含的「指令」進行計算。

1

由於傑恩指出,它可能是值得張貼的最終結果作爲一個答案,所以這裏是一個簡化版本的關鍵部位filest:

<fileset id="files" dir="${target.dir}"/> 
<pathconvert property="before.files" pathsep=","> 
    <fileset refid="files"/> 
</pathconvert> 
<!-- Other Ant code changes the file-system. --> 
<pathconvert property="after.files" pathsep=","> 
    <fileset refid="files"/> 
</pathconvert> 
<filelist id="before.files" files="${before.files}"/> 
<filelist id="after.files" files="${after.files}"/> 
<difference id="changed.files"> 
    <filelist refid="before.files"/> 
    <filelist refid="after.files"/> 
</difference> 
相關問題