Ant 条件属性重写

Ant 条件属性重写,ant,Ant,如果定义了另一个属性,我想使用条件属性将属性值设置为X,否则设置为Y。但是,我不希望用户能够从命令行重写condition属性 如何实现这一点?不,您不能覆盖命令行上的属性集。至少,这不容易做到。在命令行上重写属性的全部目的是允许用户重写默认值,以便以项目生成的方式进行修改。例如: <property file="${basedir}/build.properties"/> <property name="javac.debug" value="no"/> &l

如果定义了另一个属性,我想使用条件属性将属性值设置为X,否则设置为Y。但是,我不希望用户能够从命令行重写condition属性


如何实现这一点?

不,您不能覆盖命令行上的属性集。至少,这不容易做到。在命令行上重写属性的全部目的是允许用户重写默认值,以便以项目生成的方式进行修改。例如:

 <property file="${basedir}/build.properties"/>
 <property name="javac.debug"  value="no"/>

 <target name="compile">
    <javac destdir="${main.destdir}"
         debug="${javac.debug}">
或者,他们可以创建一个
build.properties
文件并将值放入其中

当您不使用Ant进行构建时,就会出现这种类型的问题。我知道有几个站点使用Ant脚本进行部署。我通常不鼓励这样做,因为蚂蚁并不是专为这类事情而生的。例如,Ant没有任何内置逻辑或循环。一旦设置了属性,就不能对其进行更改。这些都是构建语言的好主意,但对于通用编程语言来说却是一个糟糕的主意

此外,开发人员不应该为QA或生产进行构建。这些应该由不会覆盖默认值的构建服务器来完成


现在,如何摧毁整个经过深思熟虑的系统并造成绝对的破坏:

您可以使用项目中的任务。这样做将允许您访问Ant Contrib任务以取消设置属性

下载ant-contrib.jar文件(无论最新版本是什么),并将其放在项目下的
lib
目录中。然后你可以这样做:

<project name="danger-will-robinson" default="package" basedir="."
   xmlns:ac="http://ant-contrib.sourceforge.net">

  <!-- Define the Ant-Contrib tasks -->
  <taskdef=resource="net/sf/antcontrib/antlib.xml"
       uri="http://ant-contrib.sourceforge.net">
       <classpath>
            <fileset dir="${basedir}/lib">
                <include name="ant-contrib*.jar"/>
            </fileset>
       </classpath>
  </taskdef>

  <!-- Unset Property "foo", so you can use it -->
  <ac:var name="foo" unset="true"/>


,因此Ant Contrib任务不会与其他可能的第三方任务重叠。

从Ant 1.8开始,对于某些用例任务可能适用。因为属性是本地的,所以它以空值开始。它的作用域仅限于当前目标,但您可以使用中的
param
参数将其传递给后续目标。

ant中的属性一旦设置,就可以通过设计保持不变。您可以使用任何提供对ant api访问的脚本语言(如javascript)覆盖现有属性。
JDK>=1.6已经附带了一个javascript引擎,因此您可以使用如下内容:

<project>

 <property name="x" value="whatever"/>

 <script language="javascript">
  project.getProperty('x') ?
   project.setProperty('foo', 'true') :
    project.setProperty('foo', 'false');
 </script>

 <echo>$$[foo} => ${foo}</echo>

</project>
使用ant-f yourbuild.xml-Dfoo=bla运行这两个脚本以查看差异

Ant api还有方法project.setUserProperty(String,String),因此您也可以使用:

...
 <script language="javascript">

 project.getProperty('x') ?
    project.setProperty('foo', 'true') :
    project.setProperty('foo', 'false');

 project.getUserProperty('x') ?
  project.setUserProperty('foo', 'true') :
  project.setUserProperty('foo', 'false');

 </script>
...
。。。
project.getProperty('x')?
project.setProperty('foo','true'):
project.setProperty('foo','false');
project.getUserProperty('x')?
project.setUserProperty('foo','true'):
project.setUserProperty('foo','false');
...
防止通过设置foo属性-D即使在commandline上定义了属性x,它也会起作用-Dx=您必须做出选择的任何东西,使用javascript开箱即用或Flaka let任务编写任务脚本 oneline解决方案,但需要Flaka jar。

覆盖属性:
<project xmlns:fl="antlib:it.haefelinger.flaka">

<property name="x" value="whatever"/>

 <!--
  := defines a new property whereas
  ::= overwrites any existing property
  even userproperties
 -->
 <fl:let> foo ::= has.property['x'] ? 'true' : 'false'</fl:let>

 <echo>$$[foo} => ${foo}</echo>

</project>
...
 <script language="javascript">

 project.getProperty('x') ?
    project.setProperty('foo', 'true') :
    project.setProperty('foo', 'false');

 project.getUserProperty('x') ?
  project.setUserProperty('foo', 'true') :
  project.setUserProperty('foo', 'false');

 </script>
...