有没有一种优雅的方法来实现Ant中的目标依赖顺序?

时间:2016-07-21 00:38:09

标签: ant build-script

假设我有一个包含以下4个目标的简单构建脚本:

  1. build - 编译项目的代码,取决于init
  2. init - 设置构建环境,不依赖于任何内容
  3. clean - 删除由buildinit生成的所有文件,具体取决于
  4. all - 只需清理然后构建,取决于cleanbuild

    <project>
        <target name="build" depends="init">
            <echo>Building the project</echo>
        </target>
    
        <target name="init">
            <echo>Setting up the build environment</echo>
        </target>
    
        <target name="clean">
            <echo>Deleting all generated files</echo>
        </target>
    
        <target name="all" depends="build,clean">
            <echo>Full build complete!</echo>
        </target>
    </project>
    
  5. 这里的问题是,initclean的顺序在Ant中是不明确的。如果调用clean,则需要在所有其他目标之前运行,包括init。但是,init不能拥有depends="clean",因为我们并不总是希望运行clean

    我意识到在build目标的依赖关系(即clean)中颠倒alldepends="clean,build"的顺序会在技术上让它们在但是我并不认为这是一个令人满意的解决方案。 Ant仍然会将这些目标视为依赖树上的兄弟,并且根本不会实际执行此命令。

    另一个&#34;解决方案&#34;当然是通过使用顺序<antcall/>任务来硬编码排序。这可能是我最终可以依赖的东西,但它是我试图避免的东西(出于多种原因,可能不值得扩展)。

    另外,我知道Gradle内置了这个功能(相信我,我嫉妒它),但此时我公司的项目在Ant中根深蒂固,所以切换真的不是一个选择。

    编辑 - 为了更好地了解我正在寻找的东西,这里有一个使用我希望Ant拥有的功能的例子:

    <condition property="init.depends.list" value="clean" else="">
        <contains string="${ant.project.call-graph}" substring="clean" />
    </condition>
    
    <target name="clean" />
    
    <target name="init" depends="${init.depends.list}" />
    

    在阅读了Ant的bindtargets任务的手册页后,我开始认为Ant的目标依赖列表是不可变的,作为其核心设计理念的一部分,所以实际上可能没有好处回答这个问题。

2 个答案:

答案 0 :(得分:0)

如果您想确保init永远不会在clean之前运行。然后,您可以使用属性作为标志:

<target name="init">
    <property name="init-called" value="true"/>
</target>

<target name="clean">
    <fail if="init-called" message="init ran before clean"/>
</target>

如果initclean之前运行,则init-called属性将被设置,<fail>任务将无法构建。

另一个选择是让all依赖于两个目标:enable-clean-targetinitenable-clean-target会设置一个属性,该属性将由if目标的clean属性使用:

<target name="enable-clean-target">
    <property="run-clean" value="true"/>
</target>

<target name="clean" if="run-clean">
    <!-- ... -->
</target>

<target name="init" depends="clean">
    <!-- ... -->
</target>

<target name="all" depends="enable-clean-target, init">
    <!-- ... -->
</target>

init目标明确取决于clean,但clean只会在构建中早先运行enable-clean-target时运行。

答案 1 :(得分:0)

来自 Ant 目标 documentation

<块引用>

Ant 尝试按顺序执行depends 属性中的目标 它们出现(从左到右)。请记住,这是可能的 当较早的目标依赖时,目标可以更早地执行 就可以了。

因此,除非您的 init 和 clean 目标因附加依赖项而变得更加复杂,否则您可以依靠顺序进行排序。所以 depends="clean,build" 会可靠地工作。