使用导入标记时更改baseDir属性

时间:2012-12-10 10:59:09

标签: ant

首先让我提一下我所面临问题的背景。

我有一个目录结构如下。

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文件来自下载的源代码,我无法编辑。

所以这是我的问题,是否可以执行以下任何操作。

  1. 覆盖attribude basedir =“。”的值。在c:\ myDirectory \ Scripts \ compile-source.xml中完成 时在build.xml中?

  2. 是否可以通过任何其他机制更改build.xml中的basedir,以便在目录c:\ myDirectory \ Project1下执行脚本c:\ myDirectory \ Project1 \ build.xml?

  3. 解决此问题的其他任何方法?

  4. 非常感谢Ant专家为解决这个问题提供的任何帮助。

3 个答案:

答案 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)

对于您的情况,使用subantant任务可能更适合,但不过......

可以(但您应该知道/考虑副作用!)使用常见的 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>