[英]How can I allow an Ant property file to override the value set in another?
我有一个ant文件,它执行以下操作:
<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>
<property file="build.properties" description="local build configuration overrides"/>
我希望在build-defaults.properties(已签入SCM)中设置默认值,但允许开发人员覆盖本地build.properties中的值,以便它们可以使用本地路径。
问题是,它似乎没有起作用; 我已经设置了它,在build.properties中创建了一个覆盖,但是我的路径的值仍然是build-defaults.properties中设置的值。 我该如何做到这一点?
您的设置的初始问题是您已经反转了build.properties
和build-defaults.properties
。
Ant属性设置一次,然后永远不能被覆盖。 这就是为什么通过-Dproperty=value
在命令行上设置任何属性将始终覆盖您在文件中设置的任何内容; 该属性已设置,然后没有任何东西可以覆盖它。
所以你想要这个设置的方式是:
<property file="build.properties" description="local build configuration overrides"/>
<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>
这条路:
实际上, 可以覆盖蚂蚁属性 。 请参阅属性任务的文档:
通常,属性值无法更改,一旦设置了属性,大多数任务都不允许修改其值。
能够覆盖属性值的任务之一是script
。 任何自定义任务也可以使用此后门。 其他提议有问题Ant loadfile覆盖属性 。 这违背了蚂蚁的精神,通常是不必要的。 但是知道这一点很好,因为我只是遇到了一个相反的问题:为什么属性值会发生变化,尽管它是不可变的 。
以下是使用脚本任务更改属性值的示例目标。 它显示了使用属性的基本方法。 Ant Api中描述了所有方法,这些方法无法在线获取。 您需要下载Ant手册 。 在api
目录中有api文档。
<target name="t1">
<property name="a" value="one" />
<script language="javascript">
sProp = project.getProperty("a");
sProp = sProp.replace("e", "ly");
project.setProperty("a", sProp);
project.setNewProperty("a", "new value");
</script>
<property name="a" value="two" />
<echo>a=${a}</echo>
</target>
如何轻松设置script
任务? 使用beanshell
语言运行脚本任务有点棘手且非平凡,但在此答案中对此进行了解释 。 然而正如Rebse指出的那样,在jdk 6中开箱即用支持使用javascript
语言。
除非使用宏和javascript插件执行以下操作,否则无法覆盖Ant属性:
第1步:定义一个宏函数来覆盖属性
<!--overwrite property's value-->
<macrodef name="set" >
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<script language="javascript">
<![CDATA[
project.setProperty("@{name}", "@{value}");
]]>
</script>
</sequential>
</macrodef>
第2步:使用ant xml中的宏
<set
name="your_target_property"
value="your_value" or "${another_property}"
</set>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.