2009-12-01 61 views
11

在项目之间共享Ant目标是否有完善的方法?我目前有一个解决方案,但它有点不雅。这是我到目前为止所做的。如何最好地在项目之间共享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的依赖管理提供这些任务,我仍然会遇到问题,因为到了解决依赖关系时,我必须在我的build.xml中的目标中,并且无法导入(due到上面提到的限制)。

有没有更好的解决方案,我想完成什么?

+0

我有同样的困难。我只是做了很多复制和粘贴:)。 – 2014-05-06 20:52:21

回答

7

如果您正在使用ANT 1.8+,那么你可以只导入的版本。xml直接从托管位置。

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

由于蚂蚁1.8.0任务也可以从网址 进口资源或 类路径的资源(这是网址, 真的)。如果您需要知道 当前构建文件的源代码是否有 是文件或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> 
+0

这适用于本地文件,但是当我尝试使用URL时,它仍会尝试解析相对于本地项目路径的URL。 – 2014-05-06 20:53:06

+3

要避免URL相对于本地项目的路径被解析,请使用'' – bassim 2014-07-03 14:16:20

1

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

但是,这只适用于使用Subversion作为源代码管理的用户。对于没有使用Subversion或其他支持类似功能的SCM的用户,有一个SCM不可知的解决方案仍然很不错。

3

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

0

我们所做的是创建一个名为'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>