在 Ant 中,我可以创建一个目标,其中包含表示路径的变量之类的东西吗?
例如,类似于以下伪目标:
<target name="initPath">
Path = "${basedir}/../../myProject/Project/"
</target>
其中Path是我的变量并初始化为特定值。
我怎样才能做到这一点?
Ant 构建脚本是用 XML 编写的。要创建一个属性,必须采用 XML 样式,所以不要这样:
some_prop="some value"
它是这个:
<property name="some_prop" value="some value"/>
属性可以包含句点,我建议使用它们作为名称分隔符:
<property name="some.prop" value="some value"/>
你如何声明一个常量?这里:
<property name="some.prop" value="some value"/>
这是因为一旦设置了属性,就无法更改它。
这样,您可以执行以下操作:
<property file="${basedir}/build.properties"/>
<property name="some.prop" value="some value"/>
假设build.properties
文件包含这一行:
some.prop="Some other value"/>
现在,当您运行 Ant 构建文件时, 的值some.prop
将是“其他值”,并且<property name="some.prop" value="some value"/>
不会改变它。我什至可以这样做:
$ ant -Dsome.prop="A completely different value"
该some.prop
属性的值将覆盖我在 build.properties 文件中的内容以及我在 Ant 构建文件中的内容。
这是一个非常好的功能。它允许我设置开发人员可以覆盖的默认值:
<property name="copy.verbose" value="false"/>
...
<copy todir="${copy.to.dir}"
verbose="${copy.verbose}">
<fileset dir="${copy.from.dir}"/>
</copy>
默认情况下,当我的copy
任务运行时,它以我想要的非详细模式运行。但是,假设我的构建存在一些问题,并且我想确切地查看正在复制的内容,我可以这样做:
$ ant -Dcopy.verbose=true
而且,现在我的复制任务将显示所有正在复制的文件。
路径是一种声明类似或$CLASSPATH
在$PATH
命令行中的方式。您可以预先声明一个带有 id的路径,然后在以后使用它:
<javac destdir="${main.destdir}"
srcdir="${main.srcdir}">
<classpath>
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</classpath>
</javac>
在这里,我添加了一个类路径。这<fileset/>
用于根据我${lib.dir}
目录中的所有 jars 创建一个类路径。
我也可以这样做:
<path id="main.classpath">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<javac destdir="${main.destdir}"
srcdir="${main.srcdir}"
classpathref="main.classpath"/>
在这里,我预先声明了我的main.classpath
,然后在我的<javac>
任务中使用它。
您应该阅读在线 Ant Manual 中的 Ant。手册中有一个半体面的介绍,可能有助于为您澄清一些问题。
下面介绍如何在 Ant 脚本中定义属性。
不幸的是,它不是一个变量,因为它们是不可变的。您可以为其设置一个值,但您不能在脚本执行期间更改它。
在这里,您可以看到为属性赋值的示例。
更新。您可以使用路径任务。例如:
<path id="combinedPath">
<path path="${toString:oldPath}"/>
<path path="my.jar"/>
</path>
<path id="reanamePath">
<path path="${toString:oldPath}"/>
</path>
如果您在一个目标中更改路径,您绝对可以在另一个目标中访问它。