Ant - 在循环中调用目标一次

时间:2013-11-26 11:59:50

标签: loops ant ant-contrib

我有一个包含大多数目标的公共build.xml文件。 有两个卫星构建文件导入公共文件。卫星之间的区别在于,一个将运行共同目标一次,而另一个具有foreach ant-contrib任务,该任务循环通过子文件夹并在每个子文件夹中运行一次共同目标。

公共文件中的一个目标提示用户选择要释放到的区域(dev或qa)。 对于运行一次的卫星构建,这很好。 对于循环卫星构建,用户会看到每个子文件夹的提示,但它们都将转到相同的发布区域,因此我只需要提示一次。

简单的解决方案是将“选择区域”目标移动到每个卫星构建文件,使其仅运行一次,即它在循环之外。 我很想知道是否有更清洁的方法。

我最初的想法是在循环卫星构建中使用循环卫星构建(使用ant任务)并设置属性来调用目标。然后,我将在common公共构建文件中的select-area目标中添加一个“unless”属性,该目标检查是否已设置ant任务中设置的属性。 通过我的计算,这将意味着非循环构建运行选择区域目标,因为尚未设置属性(它做了)。 循环卫星构建运行目标(使用ant任务)但是当它循环到公共构建文件并命中选择区域目标时它仍然运行它,即使已经设置了属性并且选择区域目标具有除非属性检查它。

以下示例代码:

从Common Build中提取

<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>

一旦ant任务调用目标,就会出现,不再设置area.selected属性。

我不确定我是否以正确的方式解决这个问题,但希望我相对清楚我想要实现的目标。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分: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一次(因此两者中的代码相同),然后在递归构建中启动循环。