Ant 有效<;房地产>;蚂蚁的名字

Ant 有效<;房地产>;蚂蚁的名字,ant,Ant,我想在我的ant构建文件中设置一些属性,其名称基于ant的内置属性。特别是,我想设置如下属性: <property name="${ant.project.name}.compiled" value="true" /> 但是,当我尝试此操作时,${ant.project.home}部分没有扩展 是否可以使用属性值作为其他属性的名称,如果可以,如何使用?我认为唯一的方法是将您的值回显到.properties文件中,然后将其加载回。 然而,你应该问问自己,你是否真的需要它;当我最后

我想在我的ant构建文件中设置一些属性,其名称基于ant的内置属性。特别是,我想设置如下属性:

<property name="${ant.project.name}.compiled" value="true" />

但是,当我尝试此操作时,${ant.project.home}部分没有扩展


是否可以使用属性值作为其他属性的名称,如果可以,如何使用?

我认为唯一的方法是将您的值回显到.properties文件中,然后将其加载回。 然而,你应该问问自己,你是否真的需要它;当我最后一次使用ant时,我试着做同样的事情,但得出的结论是我真的不需要这么做

$ant.project.home.compiled


不只是有用吗?

这是可以做到的,不过有点难看。为此,您需要来自的任务。下面是一个例子

<property name="projectNameCompiled" value="${ant.project.name}.compiled" /> 
<property name="${projectNameCompiled}" value="true" /> 
<propertycopy property="final" from="${ant.project.name}.compiled" /> 

属性final包含值true

这绝对是有效的ant代码,属性iamholder.flag的值为true。 如果${name.holder}未展开,则表示尚未对其进行设置(如示例中缺少第一行)。 无论如何,这仍然不能完全解决您的问题,因为您几乎无法获取此属性的值,因为您不知道它的名称,并且无法在纯ant中进行嵌套解析。不过,这取决于你想做什么,它可能对你仍然有用。这一个可以工作(请记住,在1.8之前,只要设置了属性,该值都是无关的):


编译。。。

要真正获得此类财产的价值,您必须使用ant contrib的property Copy,如其中一个答案所示。这样,您就可以在您知道其名称的属性中获取值。只需确保在使用之前执行该技巧,并将override参数设置为true(您的帖子意味着您将设置更多类似于这些的属性,但如果没有override,则无法更改最终属性)。使用这些属性的另一个选项是使用ant宏。

有几种方法可以实现这一点,请参见

通过macrodef的一个可能的解决方案模拟了antcontrib/propertycopy任务,但不需要任何外部库。

编辑问题以正确转义xml$ant.project.home.compiled可能对我没有用处。我真的只需要设置一个标志,表明某个项目(我事先不知道该项目的名称)已经编译,这样我就可以避免再次编译它的开销,因为它足够智能,不会重新编译文件。它检查源上的日期,并与类进行比较,只有在需要时才重新编译。
<property name="name.holder" value="iamholder" />
<property name="${name.holder}.flag" value="true" />
<echoproperties></echoproperties>
[echoproperties] iamholder.flag=true
<target name="compile_stuff" unless="${name.holder}.flag">
  <echo>compiling...</echo>
</target>