2013-11-26 37 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