2010-10-21 55 views
2

說我需要做的是這樣的:螞蟻:如何寫可選的嵌套元素

<copy todir="${DEPLOYMENT_DIR}" overwrite="true"> 
    <fileset dir="dir1" /> 
    <fileset dir="dir2" /> 
    <fileset dir="dir3" /> 
    ... 
    <if> 
     <equals arg1="${SPECIAL_BUILD}" arg2="true"/> 
     <then> 
      <fileset dir="dir7" /> 
      <fileset dir="dir8" /> 
      ... 
     </then> 
    </if> 
</copy> 

(真正的任務是不可複製的,我只是用它來說明這一點)

Ant會抱怨說我的任務不支持嵌套的<if>這很公平。我一直在這樣的思考:

我可以添加一個macrodef與「元素」屬性是這樣的:

<macrodef name="myCopy"> 
    <element name="additional-path" /> 
    <sequential> 
     <copy todir="${DEPLOYMENT_DIR}" overwrite="true"> 
      <fileset dir="dir1" /> 
      <fileset dir="dir2" /> 
      <fileset dir="dir3" /> 
      ... 

      <additional-path/> 
     </copy> 
    </sequential> 
</macrodef> 

但是,這將意味着,調用者(目標)必須指定其他路徑,其我想避免(如果有很多目標調用這個任務,他們將不得不重複additional-path元素中的文件集定義)。

如何編寫裏面的其他文件集 macrodef這樣Ant就不會抱怨了?

回答

2

的一種方式(不知道一個好),以實現這一目標是創建兩個macrodefs - 一個「公」用於一般用途和一個「內部「這是真正的工作,並打算只從」公衆「宏調。像這樣:

<macrodef name="task-for-public-use"> 
    <sequential> 
     <if> 
      <equal arg1="${SPECIAL_BUILD}" arg2="true" /> 
      <then> 
       <internal-task> 
        <additional-path> 
         ... 
        </additional-path> 
       </internal-task> 
      </then> 
      <else> 
       <internal-task ... /> 
      </else> 
     </if> 
    </sequential> 
</macrodef> 


<macrodef name="internal-task"> 
    <element name="additional-path" /> 
    <sequential> 
     <copy ...> 
      ... 
      <additional-path/> 
     </copy> 
    </sequential> 
</macrodef> 

我不喜歡它,但希望有更好的方法。

1

AntContrib有一個螞蟻FileSet object augmented with if and unless conditions

http://ant-contrib.sourceforge.net/fileset.html

如果的 '如果' 條件設置屬性的名稱。除非定義了屬性 ,否則將忽略文件集 。該房產的價值是 無足輕重,但 意味着誤解(「假」, 「否」)的價值將在 評估時引發異常。

除非設置「除非」條件的屬性名稱。如果設置了名稱爲 的屬性,則將忽略文件集 。該屬性的值爲 無足輕重,但如果值爲 意味着錯誤解釋(「false」, 「no」)的行爲將在評估時引發 異常。

你可以使用這樣的:

<copy todir="${DEPLOYMENT_DIR}" overwrite="true"> 
    <fileset dir="dir1" /> 
    <fileset dir="dir2" /> 
    <fileset dir="dir3" /> 
    ... 
    <fileset dir="dir7" if="SPECIAL_BUILD" /> 
    <fileset dir="dir8" if="SPECIAL_BUILD" /> 

</copy> 
+1

這很好,但是選擇了copy + fileset作爲示例。在我的情況下,「copy」是「mxmlc」(Flex應用程序編譯器),「fileset」是「include-libraries」。仍然upvoting作爲contrib FileSet似乎很有用。 – Borek 2010-10-22 07:08:18

+0

@Borek - 我採取的另一種方法是調用XSLT樣式表來構建一個成本ANT build.xml,然後從主build.xml的目標中調用該自定義生成的build.xml文件。如果你更新的問題更符合你想要做的事情,我可以發表一個例子。 – 2010-10-22 11:06:10

+0

我寧願留在「純粹的螞蟻」這是足夠凌亂:)我已經發布我目前的解決方案 - 不是最優雅的,但實現任務。 – Borek 2010-10-22 13:39:15