如何在项目之间最好地共享Ant目标?
是否有一种成熟的方式在项目之间共享目标?我目前有一个解决方案,但有点不雅观。以下是我目前正在做的事情 我有一个名为如何在项目之间最好地共享Ant目标?,ant,build,build-process,ivy,dependency-management,Ant,Build,Build Process,Ivy,Dependency Management,是否有一种成熟的方式在项目之间共享目标?我目前有一个解决方案,但有点不雅观。以下是我目前正在做的事情 我有一个名为ivy tasks.xml的文件,托管在我们网络的服务器上。除其他目标外,该文件还包含用于管理项目依赖关系的样板任务。例如: <project name="ant-ivy-tasks" default="init-ivy" xmlns:ivy="antlib:org.apache.ivy.ant"> ... <target name="iv
ivy tasks.xml
的文件,托管在我们网络的服务器上。除其他目标外,该文件还包含用于管理项目依赖关系的样板任务。例如:
<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来访问文件
<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"/>
关于这一点的“肮脏”部分是,我必须在目标之外执行上述步骤,因为目标必须是顶级的。另外,我还必须在所有需要它的build.XML文件中包含这个XML(即,仍然有一些重复)
除此之外,可能还有其他情况,我可能需要导入一些常见的(非常春藤)任务。如果我使用Ivy的依赖关系管理来提供这些任务,我仍然会遇到问题,因为在我解决依赖关系时,我必须在build.xml中的目标内,并且无法导入(由于上面提到的约束)
是否有更好的解决方案来实现我的目标?在进行一些额外的搜索之后,一个可能的解决方案是使用build.xml检查特定的必需文件
但是,这只适用于使用Subversion作为源代码管理的用户。对于不使用Subversion的用户,如果有一个与SCM无关的解决方案,或者另一个支持类似功能的SCM,那就更好了。如果使用,您可以将它们全部打包到一个JAR文件中。然后只需将此文件复制到
${ANT_HOME}/lib
目录中即可使用它们。我们所做的是创建一个名为“bootstrap”的项目,其中包含办公室其他项目所需的各种xml文件。
因此,要设置开发环境,请在引导中运行build.xml,将xml文件(如ivy文件和其他目标文件)复制到已知位置,然后构建文件包括以下内容:
<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>
如果您使用的是ANT 1.8+,那么您可以直接从托管位置导入build.xml 由于Ant 1.8.0,该任务还可以 从URL或URL导入资源 类路径资源(URL、, 真的)。如果你需要知道 当前生成文件的源已被删除 您可以查阅文件或URL 属性ant.file.type.projectname (使用与上述相同的示例) ant.file.type.builddocs)中 具有值“file”或“url”
我也遇到了同样的困难。我只是做了大量的复制和粘贴:)。这对本地文件非常有效,但是当我尝试使用URL时,它仍然尝试相对于本地项目的路径解析URL。要避免相对于本地项目的路径解析URL,请使用
<!-- importing.xml -->
<project name="importing" basedir="." default="...">
<import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>