IVY找到一组依赖项目

时间:2014-03-28 01:29:19

标签: set ivy

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

问题是它的慢:( 。为了加快系统速度,我们希望使用ANT多线程功能,但因为这些组件之间可能存在依赖关系,所以我们不能简单地做到这一点这个问题的可能解决方案是首先找出LIST中的组件集,这些组件彼此依赖并且是独立的(像MAEVEN )。一旦我们有了这个列表,我们就可以分发构建任务了。到ANT。

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

其他信息

我们有很多项目,即单独的项目,它们都有自己的ivy.xml,用于定义第三方罐子以及彼此之间的依赖关系。例如,我们在项目A,B和C中使用ivy.xml,如下所示;

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

<?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仅限第三方部门

<?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>

现在,如果您发现我们无法为项目B 使用多线程构建,因为我们必须首先构建项目A ,然后启动B.在上面的场景中以某种方式我们发现我们可以同时执行两(2)个线程(这是好的和可取的),在一个线程构建集/组1中是A然后是B和另一个只有C的

的线程集/组2

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

1 个答案:

答案 0 :(得分:1)

您能解释一下您的设置吗?你是什​​么意思100个组件?存储在本地存储库中的100个罐子,您的产品是由100个单独的商品制成的,还是您在单个ivy.xml 100个单独的商品中指定的?您是否拥有本地企业级存储库?那是什么类型的存储库?

当您最初从常春藤取物品时,它们会在本地存储在计算机上。如果您使用<ivy:cachepath/><ivy:cachefileset>,则罐子甚至不会复制到本地工作目录,而是保存在缓存中。无需从远程存储库下载任何内容,后续构建应该快得多。

我们使用Artifactory作为我们的公司存储库。在Jenkins上,我们在每次构建之前清理缓存,这会使构建时间增加大约2分钟。我们觉得詹金斯这是合理的。在本地版本中,不会清除缓存。大多数开发人员发现构建时间非常容易。这是特别正确的,因为我已经重写了大多数构建脚本,这些脚本将构建时间从10分钟缩短到20分钟,大多数构建时间不到2分钟。如果必须从存储库中获取jar,它可能会再增加2到5分钟的构建时间,但由于缓存未定期在本地计算机上清除,因此这很少是一个问题。

<ivy:report>列出项目的jar依赖项。这对你有帮助吗?或者,你需要某种主列表吗?

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


附录

好的,我知道你正在尝试做什么。我想你可能误解了Ivy是如何工作的......

这个想法不是建立项目&#34; A&#34;当项目&#34; B&#34;建立。这个想法是项目&#34; A&#34;发布到您的站点范围的工件存储库a.jar。当项目&#34; B&#34;构建,它不需要重建&#34; A&#34;,它只是从存储库a.jar中撤出并构建。

我不知道你是否有一个本地工件库。我们使用Artifactory作为我们的Maven / Ivy存储库。实际上,我们将Artifactory设为Maven回购。我们不会通过<ivy:publish> 发布常春藤工件。我们使用<ivy:makepom/>创建pom.xml,然后使用mvn deploy将工件放入我们的仓库。这样,我们可以将工件用于Ivy或Maven,因为它与pom.xml相关联。

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

开发人员通常使用Release repo,但通过修改他们的ivy.xml文件,他们可以完成{{1>}我们的 Snapshot repo的最新版本以用于测试目的。

这种复杂化的大部分来自于我们同时使用相同的罐子的Maven和Ivy项目。我并不熟悉Ivy,可能是Ivy会为我做所有这些,并且不必担心Ivy / Maven的兼容性。我们只想保持 Maven兼容的所有内容

如果你只有常春藤项目,你可以使用a.jar实体的 status 参数来指定jar是否在集成中,< em>里程碑或发布状态。我知道<info>可以使用<ivy:publish>来覆盖status文件中的状态。这意味着大多数情况下,Ivy项目使用集成状态发布每个构建,并且当开发人员准备就绪时,他们可以使用Jenkins促销在该发布下发布该jar或里程碑状态。 Artifactory适用于常春藤发布以及Maven 部署

我们确实有一些你所要求的东西 - 反向查找依赖于罐子的项目 - 但它不是加速构建

我们的基础开发人员使用 Loosy-Goosy 开发方法。他们将放弃改变类和方法。方法名称将被更改,参数数量甚至被删除。在发布前两周,依赖于它们的项目突然无法构建,这可能会让人感到惊愕。

因此,我有一个使用ivy.xml的Perl脚本通过我们的仓库查找所有依赖Ivy的项目(由于XML::Simple位于项目的根目录中,因此很容易找到,然后通过ivy.xml查找依赖项,并构建一个反向映射。除了第一级依赖项之外,我不需要任何其他内容,这使得它很简单。

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

这对我们来说只是一次健康测试。我可以给你代码,但它是为我们的网站定制的,并没有花很长时间来制作。正如我所说,我只对第一级依赖感兴趣,因此构建此映射非常简单。它只允许我对项目 A 团队进行咆哮和狂欢,因为他们的更改会破坏依赖于a.jar的项目。