【问题标题】:How can I best share Ant targets between projects?如何在项目之间最好地共享 Ant 目标?
【发布时间】:2010-12-22 04:36:08
【问题描述】:

是否有一种成熟的方法可以在项目之间共享Ant 目标?我目前有一个解决方案,但它有点不雅。这是我目前正在做的事情。

我有一个名为ivy-tasks.xml 的文件托管在我们网络上的服务器上。除其他目标外,该文件还包含用于使用 Ivy 管理项目依赖关系的样板任务。例如:

<project name="ant-ivy-tasks" default="init-ivy"
         xmlns:ivy="antlib:org.apache.ivy.ant">
  ...
  <target name="ivy-download" unless="skip.ivy.download">
    <mkdir dir="${ivy.jar.dir}"/>
    <echo message="Installing ivy..."/>
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
         dest="${ivy.jar.file}" usetimestamp="true"/>
  </target>

  <target name="ivy-init" depends="ivy-download"
          description="-> Defines ivy tasks and loads global settings">
    <path id="ivy.lib.path">
      <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
    </path>
    <taskdef resource="org/apache/ivy/ant/antlib.xml"
             uri="antlib:org.apache.ivy.ant"
             classpathref="ivy.lib.path"/>
    <ivy:settings url="http://myserver/ivy/settings/ivysettings-user.xml"/>
  </target>
  ...
</project>

托管此文件的原因是因为我不想

  • 将文件签入到每个需要它的项目中 - 这会导致重复,从而使维护目标变得更加困难。
  • 让我的 build.xml 依赖于从源代码管理中检出项目 - 这将使构建在顶层有更多 XML 来访问文件。

我在项目的 build.xmls 中使用此文件的方式如下:

<property name="download.dir" location="download"/>
<mkdir dir="${download.dir}"/>
<echo message="Downloading import files to ${download.dir}"/>

<get src="http://myserver/ivy/ivy-tasks.xml" dest="${download.dir}/ivy-tasks.xml" usetimestamp="true"/>
<import file="${download.dir}/ivy-tasks.xml"/>

关于此的“脏”部分是我必须在目标之外执行上述步骤,因为import task 必须位于顶层。另外,我仍然必须将这个 XML 包含在所有需要它的 build.xml 文件中(即仍有一些重复)。

除此之外,在其他情况下,我可能需要导入一些常见(非 Ivy)任务。如果我要使用 Ivy 的依赖项管理来提供这些任务,我仍然会遇到问题,因为当我解决依赖项时,我必须在 build.xml 中的目标内,并且无法导入(由于到上面提到的约束)。

对于我想要完成的事情有更好的解决方案吗?

【问题讨论】:

  • 我也遇到了同样的困难。我只是做了很多复制和粘贴:)。

标签: ant build build-process ivy dependency-management


【解决方案1】:

如果您使用的是 ANT 1.8+,那么您可以直接从托管位置导入 build.xml。

http://ant.apache.org/manual/Tasks/import.html

从 Ant 1.8.0 开始,该任务还可以 从 URL 导入资源或 类路径资源(即 URL、 真的)。如果您需要知道是否 当前构建文件的源有 是您可以查阅的文件或 URL 属性 ant.file.type.projectname (使用与上面相同的示例 ant.file.type.builddocs) 具有值“文件”或“网址”。

<!-- importing.xml -->
<project name="importing" basedir="." default="...">
  <import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>

【讨论】:

  • 这对本地文件很有用,但是当我尝试使用 URL 时,它仍然会尝试解析相对于我的本地项目路径的 URL。
  • 为避免 URL 相对于本地项目的路径被解析,请使用 &lt;import&gt;&lt;url url="http://path/to/build.xml"/&gt;&lt;/import&gt;
【解决方案2】:

如果您使用Antlibs,您可以将它们全部打包到一个JAR 文件中。然后只需将此文件复制到${ANT_HOME}/lib 目录即可使用它们。

【讨论】:

    【解决方案3】:

    经过一些额外的搜索,一个可能的解决方案是使用SVN externals 来检查 build.xml 可能需要的特定所需文件。

    但是,这仅适用于使用 Subversion 作为源代码控制的用户。为不使用 Subversion 的用户或其他支持类似功能的 SCM 提供与 SCM 无关的解决方案仍然会很好。

    【讨论】:

      【解决方案4】:

      我们所做的是创建一个名为“bootstrap”的项目,其中包含我们办公室其他项目所需的各种 xml 文件。 因此,要设置您的开发环境,您可以在引导程序中运行 build.xml,它将 xml 文件(如您的 ivy-stuff 和其他目标)复制到一个已知位置,然后您的构建文件包括以下内容:

      <import file="${ant.bootstrap.dir}/ant-commons.xml" />
      <import file="${ant.bootstrap.dir}/ant-commons-ear.xml" />
      

      我们的引导 build.xml 包含以下内容:

      <target name="install">
              <fail unless="ant.bootstrap.dir" message="ant.bootstrap.dir ${missing.property.message}"/>
              <copy todir = "${ant.bootstrap.dir}">
                  <fileset dir = "src/xml"/>
              </copy>
      </target>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多