gpt4 book ai didi

ant - 分发要包含在构建中的通用 ant 文件有哪些好方法?

转载 作者:行者123 更新时间:2023-12-04 14:34:36 26 4
gpt4 key购买 nike

我在一个制作许多小型应用程序的小组中工作,并在我们的构建过程中使用 ANT。

我们希望以一种通用的方式存放一些我们常用的指令。目前,我们需要一个映射驱动器到一个公共(public)位置,并使用

<import file="${env.MAPPED_DRIVE}/common_directive.xml">

必须有一种更好的方法来分发通用 ant 文件以包含在许多项目中,而无需映射驱动器。你有什么其他的建议?

Import 是一个“顶级”指令,这意味着它不会在目标内部工作。因此,我不能简单地创建一个下载文件的目标,然后导入它。

最佳答案

我已经制定了一个解决方案,它在一个目录中创建一个包含我们可重用构建脚本的 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>

在我的情况下,这定义了项目的所有“公共(public)”目标,以进行基于 java 的构建。

语法有点冗长,尤其是当我添加越来越多的包含文件时(例如,添加创建 OSGi jar 的能力)。通过将包含 macrodef 和 scriptdef 组合的 antlib.xml 添加到 jar 文件(与共享构建脚本位于同一目录中),构建文件现在看起来像这样(现在还创建了一个 OSGi jar 包):
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="../../../../target/ant-shared-build.jar" />
<build:build using="java, jar, bundle" />
</project>

不幸的是,我不能在 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>

这有一些问题:
  • 又开始啰嗦了。
  • 每个 build.xml 都会重复详细程度。
  • 有很多重复的样板,尤其是版本号。

  • 为了缓解这些问题,在每个包含 build.xml 的目录中,我还有一个 bootstrap.xml(名称并不重要)。然后每个 build.xml 都包含此文件:
    <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>

    我应该指出,仅仅创建一个可再分发的构建并不意味着它会有用。您仍然需要投入时间和精力来创建符合类似特征的设计的内聚、模块化、一致的实现。这一点更重要,因为您需要跨项目、跨团队、跨组织边界等共享脚本。

    总之,通过创建一个带有版本号的 jar 文件,它可以独立于特定文件位置或 SCM 工具进行分发,我们可以获得真正共享但可重现的构建。

    关于ant - 分发要包含在构建中的通用 ant 文件有哪些好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124726/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com