2008-09-08 56 views
18

我們有一個Apache ANT腳本來構建我們的應用程序,然後將生成的JAR文件簽入版本控制(本例中爲VSS)。但是,現在我們有一個變更,需要我們爲這個項目構建2個JAR文件,然後檢查兩個VSS。有沒有辦法來推廣Apache ANT目標?

將原始JAR文件檢入VSS的當前目標通過某些屬性發現JAR文件的名稱。有沒有簡單的方法來「推廣」這個目標,以便我可以重用它來檢查任何名稱的JAR文件?用正常語言來說,這顯然需要一個函數參數,但據我所知,在ANT中確實沒有一個等同的概念。

回答

46

我建議與macros over subant/antcall一起使用,因爲我發現宏的主要優點是您完全控制了傳遞給宏的屬性(特別是如果您想添加新屬性) 。

您只需重構你的Ant腳本開始與你的目標:

<target name="vss.check"> 
    <vssadd localpath="D:\build\build.00012.zip" 
     comment="Added by automatic build"/> 
</target> 

創建宏(注意,複製/粘貼和替換爲@ {文件}):

<macrodef name="private-vssadd"> 
    <attribute name="file"/> 
    <sequential> 
     <vssadd localpath="@{file}" 
      comment="Added by automatic build"/> 
    </sequential> 
</macrodef> 

,並調用與您的文件宏:

<target name="vss.check"> 
    <private-vssadd file="D:\build\File1.zip"/> 
    <private-vssadd file="D:\build\File2.zip"/> 
</target> 

重構,「螞蟻的方式」

+1

看來,你已經忘記關閉標籤。它應該像`` – 2011-01-29 14:00:52

20

通常認爲版本控制你的二進制文件是一個壞主意,我不建議這樣做。但是如果你絕對必須的話,你可以使用antcall和param結合來傳遞參數並調用目標。

<antcall target="reusable"> 
    <param name="some.variable" value="var1"/> 
</antcall> 

<target name="reusable"> 
    <!-- Do something with ${some.variable} --> 
</target> 

您可以找到有關antcall task here的更多信息。

+3

這可能是一個更好的主意,用宏,而不是antcall(見其他答案)。有了antcall,你就會破壞ant的依賴機制,並且最終會產生一些令人困惑的構建日誌。 – 2011-01-11 20:45:00

3

還檢查了subant任務,它可以讓你調用多個相同的目標生成文件:

<project name="subant" default="subant1"> 
    <property name="build.dir" value="subant.build"/> 
    <target name="subant1"> 
     <subant target=""> 
      <property name="build.dir" value="subant1.build"/> 
      <property name="not.overloaded" value="not.overloaded"/> 
      <fileset dir="." includes="*/build.xml"/> 
     </subant> 
    </target> 
</project> 
5

在螞蟻macros看看。它們允許您爲Ant構建定義可重用的「例程」。你可以找到一個例子here(第15項)。

相關問題