代码之家  ›  专栏  ›  技术社区  ›  Chris R

如何允许Ant属性文件重写另一个属性文件中设置的值?

ant
  •  30
  • Chris R  · 技术社区  · 14 年前

    我有一个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中设置的值。我该怎么做?

    3 回复  |  直到 14 年前
        1
  •  49
  •   Tim Visher    14 年前

    你设置的最初问题是 build.properties build-defaults.properties 颠倒的。

    Ant Properties 只设置一次,就永远无法覆盖。这就是为什么通过 -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."/>
    

    这种方式:

    1. 命令行中设置的任何内容都优先于build.properties
    2. build.properties中设置的任何内容都将覆盖其他值
    3. 等等。
        2
  •  17
  •   Community CDub    8 年前

    事实上 ant属性可能被重写 . 请参阅 property task :

    通常属性值不能更改,一旦设置了属性, 大多数任务都不允许修改其值。

    可以重写属性值的任务之一是 script . 任何自定义任务也可以使用此后门。其他的建议有问题 Ant loadfile override property . 这违背了蚂蚁的精神,而且通常是不必要的。但很高兴知道这一点,因为我遇到了一个相反的问题:尽管 它是不变的 .

    下面是使用脚本任务更改属性值的示例目标。它显示了处理属性的基本方法。所有的方法都是在Ant Api中描述的,而antapi在网上是不可用的。你需要下载 Ant Manual . 在its中 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>
    

    如何轻松设置 脚本 任务? 使脚本任务运行 beanshell 语言是有点复杂和不琐碎的,但是它在 this answer . 然而 Rebse 注意,使用 javascript JDK6支持现成的语言。

        3
  •  4
  •   HMK    11 年前

    除非使用宏和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>
    
    推荐文章