覆盖Ant目标中的属性

覆盖Ant目标中的属性,ant,Ant,我们在从Eclipse运行的Ant脚本中使用了很多属性。我想建立一个并行部署,它使用稍微不同的属性值构建项目,并部署到不同的位置。。。部署位置也是一个属性 [如何]我的新目标可以将某些属性更新为自定义测试值,然后运行普通目标以获得所需结果 非常欢迎使用简单的示例脚本,我只知道足够的Ant:) < /代码> 您可以使用ANTLCAL()在调用的目标中使用PARAM重写属性,例如,考虑这个文件示例ANTCALL属性。 <?xml version="1.0" encoding="UTF-8"?&

我们在从Eclipse运行的Ant脚本中使用了很多属性。我想建立一个并行部署,它使用稍微不同的属性值构建项目,并部署到不同的位置。。。部署位置也是一个属性

[如何]我的新目标可以将某些属性更新为自定义测试值,然后运行普通目标以获得所需结果

非常欢迎使用简单的示例脚本,我只知道足够的Ant:)


< /代码> 您可以使用ANTLCAL()在调用的目标中使用PARAM重写属性,例如,考虑这个文件示例ANTCALL属性。
<?xml version="1.0" encoding="UTF-8"?>
<project name="AntCall Properties and Params" default="first">
    <property name="my.property" value="initial" />

    <target name="first">
      <echo message="main: my.property=${my.property}"/>
      <antcall target="second" />
      <antcall target="second">
        <param name="my.property" value="changed"/>
      </antcall>
      <antcall target="second" />
    </target>

    <target name="second">
      <echo message="second: my.property=${my.property}"/>
      <antcall target="third" />
    </target>

    <target name="third">
      <echo message="third: my.property=${my.property}"/>
    </target>
</project>
请注意,在使用“param”第二次调用target“second”时,属性的值发生了更改(在本例中,该更改被传播到在被调用的target“third”内调用的目标),但在其他调用中没有更改(不带“param”)

然而,正如文件中所述

在命令行上定义的属性不能被嵌套的
元素覆盖

这可以通过以下调用看到:

ant -f example-antcall-properties.ant -Dmy.property="from command line"
Buildfile: example-antcall-properties.ant

first:
     [echo] main: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

BUILD SUCCESSFUL
Total time: 0 seconds

重写属性可以通过将逻辑拆分为单独的文件来完成,这些文件可以作为基础包含,然后被重写

例如,创建一个基本文件,如
base.xml
,它包含所有默认属性和目标:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <!-- Sets the default properties. Override in your main build file when needed. -->
  <property name="admin.user" value="admin"/>
  <property name="admin.pass" value="admin"/>
  <target name="job1"/>
  <target name="job2"/>
</project>
GitHub上的示例:


对于并行执行,您可以使用。

对从Eclipse运行Ant知之甚少,但在命令行中我使用类似于
-Dpame=pvalue
的参数来指定属性。有效的属性始终是首先指定的属性,命令行参数是第一个。我已经在单独的属性文件中指定了这些属性。。。我需要重写它们,来点代码怎么样?您只需要指定一个新的属性文件,或者我们在这里误解了您的意思。不,一个新的属性文件是不好的。我有数百个属性,我只想让我的目标覆盖其中的5个。一个
可以设置属性值吗?
var
不是Ant本身的一部分,但这是除了预先设置覆盖值之外,我能找到的唯一方法。只有当元素位于元素之后时,这才有效,因为设置属性的人会阻止它随后的更改。
ant -f example-antcall-properties.ant -Dmy.property="from command line"
Buildfile: example-antcall-properties.ant

first:
     [echo] main: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

second:
     [echo] second: my.property=from command line

third:
     [echo] third: my.property=from command line

BUILD SUCCESSFUL
Total time: 0 seconds
<?xml version="1.0" encoding="UTF-8"?>
<project>
  <!-- Sets the default properties. Override in your main build file when needed. -->
  <property name="admin.user" value="admin"/>
  <property name="admin.pass" value="admin"/>
  <target name="job1"/>
  <target name="job2"/>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject">
  <!-- Override properties -->
  <property name="admin.user" value="root"/>
  <property name="admin.pass" value="new_pass"/>

  <!-- Import default properties -->
  <import file="${basedir}/base.xml"/>
  <!--<import><url url="https://example.com/base.xml"/></import>-->

  <target name="job1">
  <!-- Overriden job1 -->
  </target>
  <target name="job2">
  <!-- Overriden job2 -->
  </target>
</project>