首先让我提一下我所面临问题的背景。
我有一个目录结构如下。
C:\ mydirectory中
C:\ mydirectory中\ PROJECT1
C:\ mydirectory中\脚本
在 c:\ myDirectory \ Scripts 下有一个脚本,可以下载源代码(来自svn)并创建 c:\ myDirectory \ Project1 目录。< / p>
我有另一个编译Project1的ant脚本( c:\ myDirectory \ Scripts ** compile-source.xml ) 从ant脚本build.xml下载到 c:\ myDirectory \ Project1
c:\ myDirectory \ Scripts \ compile-source.xml
的代码段<project name="compile" default="buildAll" basedir=".">
<property file=".\build.properties">
</property>
.......
<import file="${project.home.path}/${project.name}/build.xml"/>
<target name="buildAll">
<antcall target="jar-pack"/>
</target>
</project>
c:\ myDirectory \ Project1 \ build.xml的片段。
<project name="CommonFeatures" default="jar-pack" basedir=".">
<description>
A build file for the Common Features project
</description>
....
</project>
请注意,项目的basedir设置为“。”对于上述两个蚂蚁脚本。
当我从 c:\ myDirectory \ Scripts 目录执行脚本 c:\ myDirectory \ Scripts \ compile-source.xml 时,目标“jar执行 c:\ myDirectory \ Project1 \ build.xml 中的-pack“。
然而,问题是build.xml中的基于attribude( basedir =“。”)是当前的工作目录,在这种情况下是 c:\ myDirectory \ Scripts 。因此,脚本build.xml出错,因为build.xml的basedir应该是 c:\ myDirectory \ Project1 。如果basedir =“。”,build.xml脚本就可以工作了。设置为“c:\ myDirectory \ Project1”,但遗憾的是build.xml文件来自下载的源代码,我无法编辑。
所以这是我的问题,是否可以执行以下任何操作。
覆盖attribude basedir =“。”的值。在c:\ myDirectory \ Scripts \ compile-source.xml中完成 时在build.xml中?
是否可以通过任何其他机制更改build.xml中的basedir,以便在目录c:\ myDirectory \ Project1下执行脚本c:\ myDirectory \ Project1 \ build.xml?
解决此问题的其他任何方法?
非常感谢Ant专家为解决这个问题提供的任何帮助。
答案 0 :(得分:0)
您可以专门引用构建文件的位置,this stack overflow thread中对此进行了描述。这将允许您获取并使用构建文件所在的目录作为参考点。
答案 1 :(得分:0)
您可以使用 subant 任务更新 basedir 。请检查此answer
创建以下 build.xml 文件(假设它位于 Z:/ any / folder 中):
<?xml version="1.0" encoding="UTF-8"?>
<project name="project">
<target name="mytarget">
<subant target="debug">
<property name="basedir" value="X:/any/dir/with/project"/>
<fileset dir="Y:/any/folder/with" includes="build.xml"/>
</subant>
</target>
</project>
您可以从 Z:/ any / folder
执行 ant mytarget答案 2 :(得分:0)
对于您的情况,使用subant
或ant
任务可能更适合,但不过......
您可以(但您应该知道/考虑副作用!)使用常见的 ant-contrib任务定义扩展ant并使用 var
task ,可以覆盖属性。请务必使用最新版本(> 1.0b3
)。
<!-- adjust to your path and include it somewhere at the beginning of your project file -->
<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="lib/ant-contrib-1.0b3.jar" />
<!-- works e.g. for basedir = /foo/bar to update it to /foo/bar/.. ~ /foo -->
<var name="basedir" value="${basedir}/.." />
更新:但必须小心,因为不会更改.
(当前工作目录)(因此<property name="x" location="tmp" />
将相对于.
而不再是basedir
;更新:在蚂蚁外设置basedir
或通过<project basedir=
设置.
到basedir
!)。以下是一些测试目标证明了对两者的影响:
<target name="tst.dummy.basedir-override">
<!-- example output:
tst.dummy.basedir-override:
[echo] basedir before: basedir=D:\tst, '.'=D:\tst\.
[echo] updating it via 'var' to '..'
[echo] basedir now: basedir=D:\tst/.., '.'=D:\tst\.
-->
<property name="cur" location="." /> <!-- makes the relative path absolute -->
<echo message="basedir before: basedir=${basedir}, '.'=${cur}" />
<echo message="updating it via 'var' to '..'" />
<var name="basedir" value="${basedir}/.." />
<property name="cur2" location="." /> <!-- makes the relative path absolute -->
<echo message="basedir now: basedir=${basedir}, '.'=${cur2}" />
</target>