27

我有一个构建脚本,作为该脚本的一部分,它将一个 jar 文件复制到一个目录,为方便起见,我们将其称为 utils jar。utils jar 由位于另一个目录中的另一个构建脚本构建。我试图让我的构建脚本运行 utils 构建脚本,以便我可以确保 utils jar 是最新的。

所以我知道我需要导入 utils 构建文件。

<import file="../utils/build/build.xml" />

这不起作用,因为与几乎所有其他 ant taks 不同,导入任务不是从 basedir 运行,而是从 pwd 运行。所以为了解决这个问题,我有这个小曲子,它确实成功导入了构建文件

  <property name="baseDirUpOne" location=".." />
  <import file="${baseDirUpOne}/utils/build/build.xml" />

所以现在我解决了我的导入问题,我需要调用任务,这应该很容易吧:

<antcall target="utils.package" />

请注意,在上面,utils 是 ../utils/build/build.xml 的项目名称

我现在遇到的问题是 ant 调用没有在 ../utils/build 中执行,所以我需要并且找不到的是 runat 属性或类似的东西,本质上是:

<antcall target="utils.package" runat="../utils/build" />

我需要这个的原因是,在我的 utils 构建文件中,选择要复制到 jar 的代码的步骤基于相对路径,以避免在我的 ant 文件中硬编码路径。有任何想法吗?

4

3 回答 3

33

我有类似的设置:我有一个主 Ant build.xml,它调用一个单独的 build.xml,负责构建我的测试。我就是这样做的:

<target name="build-tests">
    <subant target="build">
      <fileset dir="${test.home}" includes="build.xml"/>
    </subant>
</target>

诀窍是使用subant而不是antcall. 您不必导入其他构建文件。

于 2008-08-12T13:14:50.273 回答
6

尝试使用“ant”任务而不是“antcall”任务,它直接运行导入的构建,而不是将其导入到当前构建文件中。它有一个“dir”参数:

用作新 Ant 项目的 basedir 的目录。默认为当前项目的 basedir,除非 inheritall 已设置为 false,在这种情况下它没有默认值。这将覆盖被调用项目的 basedir 设置。

所以你可以这样做:

<ant antfile="${baseDirUpOne}/utils/build/build.xml" dir="../utils/build" />

或类似的东西。

于 2008-08-12T13:20:39.387 回答
0

您可以使用嵌套在 antcall 块中将参数传递给 antcall。因此,您可以通过这种方式传递属性(甚至可能是 basedir,因为属性是不可变的)。

于 2008-09-26T23:15:40.267 回答