2013-11-26 71 views
1

我有一個常見的build.xml文件,其中包含大部分目標。 有兩個衛星構建文件可導入公共文件。衛星之間的區別在於一個運行共同目標一次,而另一個則有一個foreach ant-contrib任務,它循環通過子文件夾併爲每個子文件夾運行一次共同目標。Ant - 循環調用目標一次

我的公共文件中的一個目標提示用戶選擇要釋放到(dev或qa)的區域。 對於運行一次的衛星構建,這可以正常工作。 對於循環衛星版本,每個子文件夾都會向用戶顯示提示,但它們將全部進入同一發佈區域,因此我只需要提示一次該提示。

簡單的解決方案是將「選擇區域」目標移動到每個衛星構建文件,因此它只運行一次,即它位於循環之外。 我很想知道是否有更乾淨的方法來做到這一點。

我最初的想法是在循環衛星構建中(使用ant任務)調用循環外部的目標並設置一個屬性。然後,我會在通用構建文件中的「選擇區域」目標中添加一個「除非」屬性,該文件檢查螞蟻任務中設置的屬性是否已設置。 根據我的估算,這意味着非循環構建會運行選擇區域目標,因爲該屬性尚未設置(它會這樣做)。 循環衛星構建運行目標(使用螞蟻任務),但是當它循環到公共構建文件並命中選擇區域目標時,它仍然運行該目標,即使該屬性已設置且選擇區域目標具有除非屬性檢查它。

示例代碼如下:

提液共同打造

<target name="select-area" unless="area.selected" description="prompts user what area to deploy to and validates response"> 
    <input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" /> 
    ... 
</target> 

循環衛星生成文件

<project name="run-build-file-multi" default="loop-brands"> 
    <import file="../../../common/builds/newbuild.xml"/> 
    <ant antfile="${ant.file.common} target="select-area"> 
     <property name="area.selected" value="yes" /> 
    </ant> 
    <target name="loop-brands" depends="select-area" description="loops through each brand folder found in branch folder"> 
     <foreach target="end-confirmation" param="current.brand" inheritall="true"> 
      <path> 
       <dirset dir="."> 
        <include name="*"/> 
       </dirset> 
      </path> 
     </foreach> 
    </target> 
</project> 

它一旦螞蟻任務稱爲目標出現,area.selected屬性不再設置。

我不確定我是否正在以正確的方式進行討論,但希望它能夠比較清楚我所要達到的目標。

任何協助讚賞,謝謝。

回答

1

這似乎是錯誤的:

<target name="select-area" unless="area.selected" description="prompts user what area to deploy to and validates response"> 
    <input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" /> 

應該

<target name="select-area" unless="deploy.to" description="prompts user what area to deploy to and validates response"> 
    <input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" /> 

即除非應該使用相同的變量作爲input當變量已經被設置一次,它應該保持下去。

或者,在您的兩個構建腳本中,讓腳本在開始時調用select-area一次(因此這兩個代碼都是相同的),然後在遞歸構建中啓動循環。

+0

謝謝Aaron,現在我明白了答案。完美的作品! – Neil