【问题标题】:IVY to find set of dependent projects常春藤找到一组依赖项目
【发布时间】:2014-05-07 07:21:46
【问题描述】:

我们有大约 100 个组件(不久的将来会更多)配置为使用 IVY+ANT 构建系统。

问题是它的慢:(。为了加快系统速度,我们想使用ANT多线程功能,但因为这些组件可以相互依赖,我们不能简单地这样做. 这个问题的可能解决方案是首先我们在 LIST 中找出一组相互依赖且独立的组件(Like MAEVEN)。一旦我们有了这个列表,我们就可以分发构建任务到 ANT。

那么我们有什么方法可以从 IVY 获得这种 LIST(开箱即用)?我们已经查看了 ivy:buildlist 任务,但它似乎没有给出这种类型的结果。我想知道实现它有多难,这应该很容易返回,因为 IVY 已经有了信息和依赖图,为什么它没有列出呢?

其他信息

我们有许多项目,即独立的项目,它们都有自己的 ivy.xml 定义对 3rd 方 jar 以及彼此之间的依赖关系。例如,我们有项目 A、B 和 C,其中 ivy.xml 如下所示;

项目 A - ivy.xml 仅限第 3 方部门

<?xml-stylesheet type="text/xsl" href="http://repository.temenosgroup.com/xsl/version-doc.xsl"?>
    <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="XYZ" branch="14" module="A" />
    <configurations ...
    </configurations>
    <publications>
        <artifact name="A" type="" ext="jar" />
    </publications>
    <dependencies>
        <dependency org="junit" name="junit" rev="4.8.2" conf="test"/>
    </dependencies>
</ivy-module>

项目 B - ivy.xml 定义对项目 A 的依赖

<?xml-stylesheet type="text/xsl" href="http://repository.temenosgroup.com/xsl/version-doc.xsl"?>
    <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="XYZ" branch="14" module="B" />
    <configurations ...
    </configurations>
    <publications>
        <artifact name="B" type="" ext="jar" />
    </publications>
    <dependencies>
                    <dependency org="XYZ" name="A" rev="14" conf="compile,test"/>
        <dependency org="junit" name="junit" rev="4.8.2" conf="test"/>
    </dependencies>
</ivy-module>

项目 C - ivy.xml 仅限第 3 方部门

<?xml-stylesheet type="text/xsl" href="http://repository.temenosgroup.com/xsl/version-doc.xsl"?>
    <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="XYZ" branch="14" module="C" />
    <configurations ...
    </configurations>
    <publications>
        <artifact name="C" type="" ext="jar" />
    </publications>
    <dependencies>
        <dependency org="junit" name="junit" rev="4.8.2" conf="test"/>
            </dependencies>
</ivy-module>

现在,如果您看到我们不能为 Project B 使用多线程构建,因为我们必须先构建 Project A,然后再启动 B。在上述情况下,如果不知何故我们发现我们可以在一个线程构建集/组 1 中同时执行 两个 (2) 线程(这是可以且可取的),即 A然后是 B 和另一个只有 C 的线程集/组 2。

所以我的问题是如何从 IVY 获得这个单独的组/组信息?

【问题讨论】:

  • 我查看了那个确切的问题,实际上,您将不得不重新实现大量 Maven(或其他现代工具)功能(Maven 中的反应器)。如果该问题对您的构建至关重要,则建议考虑迁移到 Maven。

标签: set ivy


【解决方案1】:

您能详细解释一下您的设置吗? 100 个组件是什么意思? 100 个 jar 存储在您的本地存储库中,您的产品由 100 个单独的项目组成,或者您在单个 ivy.xml 100 个单独的项目中指定?您有本地公司范围的存储库吗?那是什么类型的存储库?

当您最初从 Ivy 获取项目时,它们会本地存储在计算机上。如果您使用&lt;ivy:cachepath/&gt;&lt;ivy:cachefileset&gt;,jar 甚至不会复制到本地工作目录,而是保存在缓存中。后续构建应该更快,而无需从远程存储库下载任何内容。

我们使用 Artifactory 作为我们的企业存储库。在 Jenkins 上,我们在每次构建之前清理缓存,这会增加大约 2 分钟的构建时间。我们认为这对詹金斯来说是合理的。在本地构建中,缓存不会被清除。大多数开发人员发现构建时间是可以忍受的。尤其如此,因为我重写了大多数构建脚本,这些脚本将构建时间从 10 到 20 分钟缩短到了 2 分钟以下。如果必须从存储库中获取 jar,可能会再增加 2 到 5 分钟的构建时间,但由于本地计算机上的缓存不会定期清理,因此这很少会成为问题。

有一个&lt;ivy:report&gt; 列出了项目的 jar 依赖项。这对你有帮助吗?或者,您需要某种主列表吗?

同样,如果没有更多信息,很难知道您的问题可能是什么。


附录

好的,我明白你要做什么了。我想你可能误解了 Ivy 的工作原理……

这个想法不是在构建项目“B”时构建项目“A”。这个想法是项目“A”发布到您的站点范围的工件存储库a.jar。当项目“B”构建时,它不需要重新构建“A”,它只是从存储库a.jar 中拉出并构建。

我不知道您是否有本地工件存储库。我们使用Artifactory 作为我们的 Maven/Ivy 存储库。实际上,我们使 Artifactory 成为 Maven 存储库。我们不通过&lt;ivy:publish&gt;发布 Ivy 工件。我们使用&lt;ivy:makepom/&gt; 创建pom.xml,然后使用mvn deploy 将工件放入我们的repo。这样,我们可以将工件用于 Ivy 或 Maven,因为它有一个与之关联的pom.xml

我们使用Jenkins 作为我们的持续集成服务器。在创建 jars 文件供其他项目使用的项目中,我们使用 mvn deploy 将每个构建部署到我们的 Snapshot 存储库。在 Ivy 中,我相信这与 integration 状态 jar 相同。当开发人员认为他们对项目 A 的更改已准备好迎接黄金时段时,他们推广 Jenkins 构建以将 a.jar 发布到我们的 Maven Release存储库。

开发人员通常使用 Release 存储库,但通过修改他们的 ivy.xml 文件,他们可以将 Snapshot 存储库的 a.jar 的最新版本用于测试目的。 p>

这种复杂性主要是因为我们有使用相同 jar 的 Maven 和 Ivy 项目。我对 Ivy 不是很熟悉,而且 Ivy 可能会为我完成所有这些工作,因此无需担心 Ivy/Maven 兼容性。我们只是想保持一切Maven 兼容

如果你只有 Ivy 项目,你可以使用 &lt;info&gt; 实体的 status 参数来指定 jar 是否在 integration里程碑,或发布状态。我知道&lt;ivy:publish&gt; 可以使用status 覆盖ivy.xml 文件中的状态。这意味着大多数时候,Ivy 项目以 integration 状态发布每个构建,当开发人员准备好时,他们可以使用 Jenkins 促销在该 release 下发布该 jar或里程碑状态。 Artifactory 适用于 Ivy publish 以及 Maven deploy

我们确实有一些东西可以满足您的要求——反向查找依赖于 jar 的项目——但这不是为了加快构建速度

我们的基础开发人员使用 Loosy-Goosy 开发方法。他们会随意更改类和方法。方法名称会被改变,参数的数量,甚至被移除。依赖它们的项目突然无法构建,这在发布前两周可能会有点惊慌。

因此,我有一个使用 XML::Simple 的 Perl 脚本,它通过我们的 repo 查找所有 Ivy 依赖项目(很容易找到,因为 ivy.xml 位于项目的根目录中,然后通过 ivy.xml 到查找依赖关系,并构建一个反向映射。我不需要任何比一级依赖关系更简单的东西。

我使用这个反向映射告诉 Jenkins 在依赖 jar 被部署到我们的 Maven 发布存储库时强制构建依赖项目。例如,如果开发人员部署了新版本的a.jar,项目B 将重新构建,但依赖于b.jar 而不是a.jar 的项目将不会重新构建。

这只是对我们的理智测试。我可以给你代码,但它是为我们的网站定制的,我很快就完成了。正如我所说,我只对第一级依赖关系感兴趣,所以构建这张地图非常简单。它只是让我可以在项目A团队的更改破坏依赖a.jar的项目时向他们咆哮和咆哮。

【讨论】:

  • 我想我明白你想要什么了。
  • 感谢 David 提供的信息,这有助于了解 IVY 的构建方式。是的,我们有本地和远程仓库。如果您可以共享 Perl 脚本,那将是一个很大的帮助。谢谢
猜你喜欢
  • 2011-01-23
  • 2017-02-23
  • 2010-10-28
  • 2011-02-03
  • 2013-10-14
  • 2010-11-06
  • 2012-08-05
  • 2012-01-10
  • 2011-10-24
相关资源
最近更新 更多