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