分发要包含在构建中的通用ant文件的好方法有哪些?
我在一个团队中工作,我们生产许多小应用程序,并使用ANT进行构建过程 我们希望以一种通用的方式容纳一些常用指令。目前,我们需要一个映射到公共位置的驱动器,并使用分发要包含在构建中的通用ant文件的好方法有哪些?,ant,build-process,Ant,Build Process,我在一个团队中工作,我们生产许多小应用程序,并使用ANT进行构建过程 我们希望以一种通用的方式容纳一些常用指令。目前,我们需要一个映射到公共位置的驱动器,并使用 <import file="${env.MAPPED_DRIVE}/common_directive.xml"> 必须有一种更好的方法来分发一个通用的ant文件,以包含在许多项目中,而不必映射驱动器。你还有其他建议吗 导入是一个“顶级”指令,这意味着它在目标内部无法工作。因此,我不能简单地创建一个下载文件然后导入的目标
<import file="${env.MAPPED_DRIVE}/common_directive.xml">
必须有一种更好的方法来分发一个通用的ant文件,以包含在许多项目中,而不必映射驱动器。你还有其他建议吗
导入是一个“顶级”指令,这意味着它在目标内部无法工作。因此,我不能简单地创建一个下载文件然后导入的目标。如果您在网站上使用并托管公共构建片段
自Ant 1.8.0以来,该任务还可以
从URL导入资源或
类路径资源(URL、,
真的)。如果你需要知道
当前生成文件的源已被删除
您可以查阅文件或URL
属性ant.file.type.projectname
(使用与上述相同的示例)
ant.file.type.builddocs)中
具有值“file”或“url”
如果你想要可重复的构建,你的URL引用是个坏主意,这让我想到了
<强>另一个要考虑的解决方案,如果您使用的是版本控制的VSN,则创建一个指向
svn手动创建这样的场景
签出
以创建嵌套
正在尝试的工作副本结构
实现。但是如果这个布局是
对于使用您的
每个其他用户都需要
执行相同的签出
你做的手术
幸运的是,Subversion提供了
支持外部定义An
externals定义是
本地目录到URL,理想情况下
版本化版本的特定修订
目录。在Subversion中,您声明
使用组中的外部定义
svn:externals
属性。你可以
使用创建或修改此属性
svn propset或svn propedit(参见
名为“”的节)。它可以设置在任何位置
版本目录及其值
描述外部存储库和
位置和客户端目录
该位置应位于哪个位置
退房了
svn:externals的便利性
属性是,一旦在
版本目录,所有
用它签出一份工作副本
目录还可以从
外部定义。换句话说,
一旦一个人做出努力
定义嵌套的工作副本
结构,其他人不必这样做
麻烦Subversion将在检查后
拿出原始工作副本,
也会自动签出
外部工作副本
我已经制定了一个解决方案,创建一个jar文件,其中包含目录中的可重用构建脚本,比如com/example/ant/sharedbuild,可以在ant 1.8中导入:
<project>
<import>
<javaresource name="com/example/ant/sharedbuild/java.xml">
<classpath location="../../../../target/ant-shared-build.jar" />
</javaresource>
</import>
</project>
在我的例子中,这定义了项目的所有“公共”目标,以进行基于java的构建
语法有点冗长,尤其是当我添加越来越多的include文件时(比如说,添加创建osgijar的功能)。通过将包含宏定义和脚本定义组合的antlib.xml添加到jar文件(与共享构建脚本位于同一目录中),构建文件现在可以如下所示(现在还创建了一个OSGi jar包):
不幸的是,我不能在macrodef或scriptdef中共享代码,但实际上并不难:使用一点javascript来解析using属性并在每个属性上循环,从中派生一个文件名,然后导入
我在硬盘上的固定位置(相对于我的项目)引用jar文件。我认为我们可以做得更好。理想情况下,我希望从中心位置获取一个(版本化的!)jar文件。因为我们已经在使用Ivy(带有HTTP存储库),所以我们可以在那里发布jar文件(同样是一个版本),并直接从那里获取它:
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<property name="ant.shared.build.jar.file"
location="${user.home}/ant/ant-shared-build-1.5.3.jar" />
<get src="http://repo.example.com/.../ant-shared-build-1.5.3.jar"
dest="${ant.shared.build.jar.file}"
skipexisting="true" />
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="${ant.shared.build.jar.file}" />
<build:build using="java, jar, bundle" />
</project>
这方面存在一些问题:
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<include file="bootstrap.xml" />
<build:build using="java, jar, bundle" />
</project>
每个bootstrap.xml至少包括其父级的bootstrap.xml:
<project>
<include file="../bootstrap.xml" />
</project>
顶层bootstrap.xml(根目录),然后执行获取jar文件和创建自定义任务的工作,如上所述:
<project>
<property name="ant.shared.build.version"
value="1.5.3" />
<property name="ant.shared.build.jar.filename"
value="ant-shared-build-${ant.shared.build.version}.jar" />
<property name="ant.shared.build.jar.file"
location="${user.home}/ant/${ant.shared.build.jar.filename}" />
<get src="http://repo.example.com/.../${ant.shared.build.jar.filename}"
dest="${ant.shared.build.jar.file}"
skipexisting="true" />
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="${ant.shared.build.jar.file}" />
</project>
虽然与这个问题没有直接关系,但我实际上正在将macrodef和scriptdef修改为一个自定义ant任务,因为我希望能够支持如下语法:
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<include file="bootstrap.xml" />
<build:build>
<using>
<java />
<bundle>
<manifest>
Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
Bundle-Activator: com.example.time.impl.Activator
</manifest>
</bundle>
</using>
</build:build>
</project>
导入包:*,org.joda.time;version=“[1.6.0,1.6.0]”
捆绑激活器:com.example.time.impl.Activator
我应该指出,仅仅创建一个可再发行的构建并不意味着它会有用。您仍然需要投入时间和精力来创建符合des的内聚、模块化、一致的实现
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<include file="bootstrap.xml" />
<build:build>
<using>
<java />
<bundle>
<manifest>
Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
Bundle-Activator: com.example.time.impl.Activator
</manifest>
</bundle>
</using>
</build:build>
</project>