蚂蚁条件目标和'递归'

时间:2011-10-07 12:23:27

标签: coding-style ant if-statement dependencies

我对蚂蚁很陌生,而且我看过鲍勃叔叔的“提取物直到你放弃”这一集。

因此,我尝试尽可能小地定义ant-targets,这样你就可以准确地看到目标的本质,而不是更多。有关更多详细信息,您必须参考子目标。

无论是好的还是坏的风格都是不同的辩论(或者可能是火焰战争)。

因此,我创建的构建脚本在伪代码中看起来像这样:

build =
   compile
   instrument if coverage

coverage任务也分为子目标:

coverage:
   create-coverage-dirs
   call-cobertura

编辑 - 我想表达不应该运行coverage个子目标。

但是......我很难在蚂蚁中表达这种“干净利落”。

假设我可以使用depends属性来指示...目标间依赖关系,我得到类似的结果:

<target name="build" depends="compile, coverage"/>

<target name="compile"> .... </target>

<target name="coverage" depends="
       create-coverage-dirs, 
       taskdef-cobertura"
 if="build.with.coverage">

  <cobertura-instrument ...> ... </cobertura-instrument>

</target>

<target name="create-coverage-dirs">
  ...    
</target>

<target name="taskdef-cobertura">
  ...
</target>

这看起来不错!

只有在执行时,coverage任务才被删除,但当build.with.coveragefalse时,它的子任务仍然执行

>ant -v compile
Build sequence for target(s) `build' is 
  [compile, create-coverage-dirs, taskdef-    cobertura, coverage, build]
Complete build sequence is 
  [compile, create-coverage-dirs, taskdef-cobertura, coverage,    build, ]

我可以在每个coverage子任务中添加if属性,但这对我来说似乎并不干净。

所以这就是问题:

  1. 我的蚂蚁是一种可怕的方言吗?我正在制作蚂蚁吗?
  2. if应该以这种方式使用,还是有if-and-recurse种属性?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

在这种情况下,我根本不会使用属性,而只依赖于depends(这对我来说对此任务来说更自然):

<target name="build" depends="compile, coverage"/>

<target name="compile"> ...

<target name="coverage" 
        depends="compile, instrument,
                 create-coverage-dirs, taskdef-cobertura"> ...

答案 2 :(得分:1)

if attribute测试属性是否存在,而不是true或false。如果您不想运行coverage目标,则不要定义属性build.with.coverage

从Ant 1.8.0开始,您可以使用属性扩展将属性重新设置为布尔值:

<target name="coverage" depends="
           create-coverage-dirs, 
           taskdef-cobertura"
        if="${build.with.coverage}">