0

让我首先提供我面临的问题的背景。

我的目录结构如下。

c:\myDirectory
c:\myDirectory\Project1
c:\myDirectory\Scripts

c:\myDirectory\Scripts下有一个脚本,用于下载源代码(从 svn)并创建c:\myDirectory\Project1目录。

我有另一个 ant 脚本 ( c:\myDirectory\Scripts**compile-source.xml ) 从下载到c:\myDirectory\Project1 的 ant 脚本 build.xml 编译 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时, c:\myDirectory\Project1\build.xml中的目标“jar-pack”会被执行。

但是,问题在于 build.xml ( basedir="." ) 中的 basedir 属性是当前工作目录,在本例中是其c:\myDirectory\Scripts。因此脚本 build.xml 出错,因为 build.xml 的 basedir 应该是c:\myDirectory\Project1。如果 basedir=".",build.xml 脚本会起作用。被设置为"c:\myDirectory\Project1",但不幸的是 build.xml 文件来自下载的源代码,我无法编辑。

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

  1. 覆盖属性 basedir="." 的值 在 build.xml 时在 c:\myDirectory\Scripts\compile-source.xml 中完成?

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

  3. 还有其他方法可以解决这个问题吗?

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

4

3 回答 3

0

对于您的情况,subantant任务的使用可能更适合,但尽管如此......

可以(但您应该知道/考虑副作用!)使用常见的ant-contrib任务定义扩展 ant并使用能够覆盖属性的var任务。确保使用最新版本 ( )。> 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在 ant 或 via 之外设置<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>
于 2014-09-11T11:32:25.473 回答
0

您可以使用subant任务更新basedir 。检查这个答案

创建以下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

于 2013-04-30T09:56:51.173 回答
0

您可以具体引用构建文件的位置,在此堆栈溢出线程中对此进行了描述。这将允许您获取和使用构建文件所在的目录作为参考点。

于 2013-03-06T16:16:37.727 回答