【问题标题】:How to use one target in multiple targets' 'depends' property in ANT build?如何在 ANT 构建中使用多个目标的“依赖”属性中的一个目标?
【发布时间】:2017-12-22 07:54:20
【问题描述】:

我正在使用 ANT 构建进行部署过程。为此,我遵循以下几点,

  1. 在 ANT 中创建了五个名为“initiate.deploy”的目标(用于启动 部署),'svn.checkout'(从 SVN 签出源到 工作区),'generate.ear'(EAR 生成)和'deploy.ear' (将 EAR 部署到服务器中),“clean.workspace”(清理工作空间) 脏)。
  2. 目标“initiate.deploy”是我的默认目标。
  3. 我需要在 'svn.checkout' 目标之前清理工作区目录 在“deploy.ear”目标之后。
  4. 我将 'clean.workspace' 目标放在了 'depends' 属性中 'svn.checkout' 目标和 'initiate.deploy' 目标。

我的代码:

    <target name="initiate.deploy" description="Initiate deployment" depends="svn.checkout, generate.ear, deploy.ear, clean.workspace">
        ..........................
    </target>

    <target name="svn.checkout" description="SVN checkout" depends ="clean.workspace">
        ..........................
    </target>

但是目标 'clean.workspace' 只在 'svn.checkout' 之前执行一次,而不是在 'deploy.ear' 目标之后。

构建序列创建如下。

目标“initiate.deploy”的构建顺序是 [clean.workspace, svn.checkout、check.workSpace、update.property.file、generate.ear、 部署.ear,启动.部署]

如何在 ANT build 中使用多个目标的 'depends' 属性中的一个目标?

【问题讨论】:

    标签: ant


    【解决方案1】:

    Ant documentation中所述:

    在从给定目标向后延伸的依赖链中,例如 上面的 D,每个目标只执行一次,即使不止一个 目标取决于它。

    我的理解是,这是为了避免依赖关系图中的循环。

    因此,您需要修改目标,例如通过从 initiate.deploy 的依赖项中删除 clean.workspace 并通过 antcall 任务显式调用它:

    <target name="initiate.deploy" description="Initiate deployment" depends="svn.checkout, generate.ear, deploy.ear">
        ..........................
        <antcall target="clean.workspace" />
    </target>
    
    <target name="svn.checkout" description="SVN checkout" depends ="clean.workspace">
        ..........................
    </target>
    

    更新:

    如 cmets 中所述,antcall 任务将在新的 Ant 项目中启动调用的目标,这会产生不希望的开销。为了避免这种行为,可以将目标包装为macrodef 并将其作为任何其他目标中的任务调用。然后,您可以更改调用的目标,使其调用新的macrodef,以使其作为其他任务的依赖项保持可用:

    <target name="initiate.deploy" description="Initiate deployment" depends="svn.checkout, generate.ear, deploy.ear">
        ..........................
        <clean.workspace.macro />
    </target>
    
    <target name="svn.checkout" description="SVN checkout" depends ="clean.workspace">
        ..........................
    </target>
    
    <target name="clean.workspace">
        <clean.workspace.macro />
    </target>
    
    <macrodef name="clean.workspace.macro">
       <sequential>
            <!-- do the workspace cleanup -->
            ..........................
       </sequential>
    </macrodef>
    

    【讨论】:

    • 感谢您的解释。它非常清楚。但是当我们使用 antcall 时,它会启动一个新的 Ant 构建实例。对吗?
    • @AJK 是的,你是对的,被调用的目标将在一个新的 Ant 项目中启动。我更新了答案以反映这一点并提出了替代方案
    • 谢谢。由于我是 Ant 新手,因此我从中学到了新的重要知识。
    • 如何在 macrodef 中使用 'if' 属性,因为只有在设置了属性时我才需要执行一项任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2023-03-07
    相关资源
    最近更新 更多