2009-05-06 92 views
63

我不知道如何设置一个Ant属性,条件是它尚未设置(即它没有在属性文件中定义,并应该自动默认) 。如何设置一个Ant属性,如果它未被设置

到目前为止,我只有下面的代码:

<condition property="core.bin" value="../bin"> 
    <isset property="core.bin"/> 
</condition> 

但这似乎只如果该值在<property>标签定义工作。

有谁知道如何有条件地设置属性第一次,如果它目前未设置?

回答

106

您只需使用属性任务设置属性即可。如果该属性已设置,则该值不变,因为属性是不可变的。

但你也可以包括“而不是”你的条件:

<condition property="core.bin" value="../bin"> 
    <not> 
     <isset property="core.bin"/> 
    </not> 
</condition> 
58

蚂蚁在默认情况下做到这一点;如果该物业已经设定;再设置它没有任何效果:

<project name="demo" default="demo"> 
    <target name="demo" > 
     <property name="aProperty" value="foo" /> 
     <property name="aProperty" value="bar" /> <!-- already defined; no effect --> 
     <echo message="Property value is '${aProperty}'" /> <!-- Displays 'foo' --> 
    </target> 
</project> 

给人

/c/scratch> ant -f build.xml 
Buildfile: build.xml 

demo: 
    [echo] Property value is '${aProperty}' 

BUILD SUCCESSFUL 
Total time: 0 seconds 
/c/scratch> ant -f build.xml 
Buildfile: build.xml 

demo: 
    [echo] Property value is 'foo' 

BUILD SUCCESSFUL 

属性不能被重新定义;要做到这一点,你需要使用像variable task from ant-contrib

+0

这是不正确的。以下示例中的第一个回显将打印“Ha1”,第二个回显将打印“Ha2”:\t <如果test =“$ {deploy.env =='PROD'}”> \t \t \t \t <回声消息= ”设置d​​eploy.root.dir到:$ {deploy.root.dir}“/> \t \t <属性名=” 部署.root.dir“value =”Ha2“/> \t Denis 2015-09-22 14:54:12

2

Ant中的属性是不可变的。定义后,他们不能改变。

Ant Contrib包提供了variable任务。它像一个属性一样工作,但可以修改和取消设置值。 〔实施例从variable task documentation

<var name="x" value="6"/> 
    <if> 
     <equals arg1="${x}" arg2="6" /> 
     <then> 
      <var name="x" value="12"/> 
     </then> 
    </if> 
    <echo>${x}</echo> <!-- will print 12 --> 
6

最简单的方式做你想要的:

<if> 
    <not> 
     <isset property="your.property"/> 
    </not> 
    <then> 
     <property name="your.property" value="your.value"/> 
    </then> 
</if> 
2

有支持使用“其他”中的:https://ant.apache.org/manual/Tasks/condition.html以满足您的确切目的。

其他

The value to set the property to if the condition evaluates to false. By default the property will remain unset. Since Apache Ant 1.6.3 

所以更改为:

<condition property="core.bin" else="../bin"> 
    <isset property="core.bin"/> 
</condition>