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

时间:2017-12-22 07:54:21

标签: ant

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

  
      
  1. 在ANT中创建了名为'initiate.deploy'的五个目标(以启动   部署),'svn.checkout'(从SVN结帐到   工作空间),'generate.ear'(EAR生成)和'deploy.ear'   (将EAR部署到服务器中),'clean.workspace'(清理工作区   dirtory)。
  2.   
  3. 目标'initiate.deploy'是我的默认目标。
  4.   
  5. 我需要在'svn.checkout'target之前清理工作区目录   并在'deploy.ear'target。
  6. 之后   
  7. 我将'clean.workspace'目标放在'depends'属性中   'svn.checkout'目标并在'initiate.deploy'目标。
  8.   

我的代码:

    <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构建中的多个目标“依赖”属性中使用一个目标?

1 个答案:

答案 0 :(得分:1)

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