7

在 Ant 中,我可以创建一个目标,其中包含表示路径的变量之类的东西吗?

例如,类似于以下伪目标:

<target name="initPath">
    Path = "${basedir}/../../myProject/Project/"
</target>

其中Path是我的变量并初始化为特定值。

我怎样才能做到这一点?

4

3 回答 3

11

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。手册中有一个半体面的介绍,可能有助于为您澄清一些问题。

于 2013-10-21T15:01:31.663 回答
1

下面介绍如何在 Ant 脚本中定义属性。

不幸的是,它不是一个变量,因为它们是不可变的。您可以为其设置一个值,但您不能在脚本执行期间更改它。

在这里,您可以看到为属性赋值的示例。

更新。您可以使用路径任务。例如:

    <path id="combinedPath">
        <path path="${toString:oldPath}"/>
        <path path="my.jar"/>
    </path>

    <path id="reanamePath">
        <path path="${toString:oldPath}"/>
    </path>

如果您在一个目标中更改路径,您绝对可以在另一个目标中访问它。

于 2013-10-21T14:21:30.870 回答
0

Ant 具有内置的类路径支持

通常,您不会为此功能使用属性。

请考虑阅读 Ant 文档;这是 Ant 101,从长远来看,如果您花一些时间阅读文档并弄清楚 Ant 的做事方式,它会更快。

于 2013-10-21T14:26:43.467 回答