有没有办法保证ant依赖只运行一次?

CPe*_*ins 7 ant

我的问题类似于避免重新构建先决条件,除了我的需要不涉及创建的对象,而是调用了进程,因此在那里讨论的解决方案对我来说不起作用.至少我是这么认为的 - 但我是蚂蚁的新手.

我的情况是我正在编写一组蚂蚁目标,我需要一次只执行一次let-call-it 设置目标,无论调用哪个目标.这是一个非常简化的例子:


    <?xml version="1.0"?>
    <project name="Ant_Test" basedir=".">
      <target name="setup">
        <echo message="In setup" />
      </target>
      <target name="do.several" depends="setup">
        <echo message="In do.several, calling do.first" />
        <antcall target="do.first" />
        <echo message="In do.several, calling do.second" />
        <antcall target="do.second" />
      </target>
      <target name="do.first" depends="setup">
        <echo message="In do.first" />
      </target>
      <target name="do.second" depends="setup">
        <echo message="In do.second" />
      </target>
    </project>
Run Code Online (Sandbox Code Playgroud)

我需要设置要准确地调用一次,无论do.several,do.first,或do.second被调用.通过我上面的天真尝试,在三次调用设置中调用do.several结果.

我想过设置一个属性(让我们称之为setup.has.been.invoked),并使用它来有条件地从每个目标中调用设置,但看起来属性设置仅限于它完成的范围,所以如果在setup中,我将setup.has.been.invoked设置为true,该值仅存在于setup中.

我错过了什么?是否有我跳过的教程或在线文档的一部分?任何指针或提示?

Pet*_*ang 11

您应该删除antcalls和添加do.first以及do.second作为依赖项do.several:

<target name="do.several" depends="setup, do.first, do.second">
</target>
Run Code Online (Sandbox Code Playgroud)

这将确保,setup只调用一次:

setup:
     [echo] In setup

do.first:
     [echo] In do.first

do.second:
     [echo] In do.second

do.several:

BUILD SUCCESSFUL
Total time: 0 seconds
Run Code Online (Sandbox Code Playgroud)

文档说明为什么设置中的属性设置不适用于antcall:

被调用的目标在新项目中运行; 请注意,这意味着被调用目标设置的属性,引用等不会保留回调用项目.


小智 9

我只想添加另一种可能的方法来做到这一点.

<target name="setup" unless="setup.already.executed">
    <echo message="In setup" />
    <property name="setup.already.executed" value="x" />
</target>
Run Code Online (Sandbox Code Playgroud)

这样你只运行一次然后立即设置它已经执行过一次的标志.此外,它不会破坏代码的"依赖"部分,因为它只在可能/必要时才运行目标,但它不会破坏目标依赖目标的执行.

这也是脚本中最少量的更改.

编辑:'不破坏依赖部分'的说明:

如果调用'ant do.first do.second',即使所有目标都使用setup作为依赖项,它也会导致设置被调用两次.如果设置正在执行克隆repo或其他耗时的操作,那将是一个问题.这种方法适用于两种情况 - 即'ant do.several'或'ant do.first do.second'.