如何在ANT构建中的多个目标“依赖”属性中使用一个目标?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ANT构建中的多个目标“依赖”属性中使用一个目标?相关的知识,希望对你有一定的参考价值。

我正在使用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'目标放在'svn.checkout'目标的'depends'属性和'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,deploy.ear,initiate.deploy]

如何在ANT构建中的多个目标“依赖”属性中使用一个目标?

答案

Ant documentation所述:

在从上面的给定目标(例如D)延伸回来的依赖链中,每个目标只执行一次,即使多个目标依赖于它。

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

因此,您需要修改目标,例如从clean.workspace的依赖项中删除initiate.deploy并通过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>

更新:

正如评论中所提到的,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>

以上是关于如何在ANT构建中的多个目标“依赖”属性中使用一个目标?的主要内容,如果未能解决你的问题,请参考以下文章

使用Ant构建当前构建目标的依赖关系

Ant 到 Maven - 多个构建目标

如何在 Ant 目标中使用文件大小

Ant 属性在 Windows 中是可变的,但在 Unix 中不是?

如何使用 Ant 和 Ivy 构建项目及其依赖项

ANT--------构建文件build.xml