【问题标题】:Ant - Call Target in Loop OnceAnt - 循环调用目标一次
【发布时间】:2013-11-26 11:59:49
【问题描述】:

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

我在公共文件中的一个目标提示用户选择要发布到的区域(dev 或 qa)。 对于运行一次的卫星版本,这工作正常。 对于循环卫星构建,每个子文件夹的提示都会显示给用户,但它们都将转到相同的发布区域,因此我只需要询问此提示一次。

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

我最初的想法是在循环之外调用目标,在循环卫星构建中(使用 ant 任务)并设置一个属性。然后,我将向公共构建文件中的选择区域目标添加一个“除非”属性,该属性检查是否已设置 ant 任务中设置的属性。 据我估计,这意味着非循环构建运行选择区域目标,因为尚未设置属性(它确实如此)。 循环卫星构建运行目标(使用 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>

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

我不确定我是否以正确的方式进行此操作,但希望相对清楚我想要实现的目标。

任何帮助表示感谢,谢谢。

【问题讨论】:

    标签: loops ant ant-contrib


    【解决方案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" />
    

    即unless 应该使用与input 相同的变量当变量被设置一次时,它应该保持这种状态。

    或者,在您的两个构建脚本中,让脚本在开头调用一次 select-area(因此这两个代码中的代码相同),然后在递归构建中启动循环。

    【讨论】:

    • 谢谢亚伦,现在我看到了答案,这似乎很明显。完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2014-11-06
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多