如何在项目之间最好地共享Ant目标?

时间:2009-12-01 21:28:41

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

是否有完善的方式在项目之间共享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必须位于顶层。另外,我仍然需要在所有需要它的build.xml文件中包含这个XML(即仍然有一些重复)。

最重要的是,可能还有其他情况我可能会执行我想要导入的常见(非常春藤)任务。如果我使用Ivy的依赖管理提供这些任务,我仍然会遇到问题,因为当我解决依赖关系时,我必须在build.xml中的目标内部,并且无法导入(由于到上面提到的约束。)

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

4 个答案:

答案 0 :(得分:7)

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

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

  

由于Ant 1.8.0的任务也可以   从URL或URL导入资源   classpath资源(即URL,   真)。如果你需要知道是否   当前构建文件的源代码   是您可以咨询的文件或URL   属性ant.file.type.projectname   (使用与上面相同的例子   ant.file.type.builddocs)其中之一   具有值“file”或“url”。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

但是,这仅适用于使用Subversion作为源代码管理的用户。对于不使用Subversion的用户或支持类似功能的其他SCM,仍然可以使用SCM无关的解决方案。

答案 3 :(得分:0)

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

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

我们的bootstrap 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>