我的问题类似于避免重新构建先决条件,除了我的需要不涉及创建的对象,而是调用了进程,因此在那里讨论的解决方案对我来说不起作用.至少我是这么认为的 - 但我是蚂蚁的新手.
我的情况是我正在编写一组蚂蚁目标,我需要一次只执行一次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'.