【问题标题】:Ivy - output the results of a resolve to an ivy fileIvy - 将解析结果输出到 ivy 文件
【发布时间】:2012-05-13 18:02:54
【问题描述】:

解析了我的ivy.xml 文件后,我想创建一个新的resolved-ivy.xml 文件,其中包含解析中找到的所有传递依赖项可以这样做吗?

这与交付不同,交付(我相信)只写出来自您的ivy.xml 的直接依赖项,而不是传递依赖项。 deliver Ant 任务确实有一个 delivertarget 属性,在文档中看起来应该这样做。实际上,它仅适用于同一组织中的模块(因此通常不适用于所有依赖项)并为每个模块生成一个文件。

它也与解析期间生成的ivy-report XML 文件不同,但差别不大。如果我正在尝试的东西是不可能的,那么我想我会直接破解这个文件。

这里的上下文是尝试启用可重复的可重现构建,包括对存储库进行更改(新库、版本)的情况。互联网上有一些帖子试图这样做,但我发现没有一个可以正确地做到这一点。

  • 添加到 Ivy 存储库可能会更改解析结果,特别是如果存储库中任何位置(不仅仅是您的项目)的任何依赖项都具有范围依赖项。示例:A 依赖于 B;[2.0,4.0]B;3.1 稍后会添加到存储库中。
  • 想法是正常解析,将解析写入一个扁平的 Ivy 文件,将其保存在项目的 VCS 中以获取该标签(或其他),然后使用 transitive="false" 解析该文件。假设存储库中的现有项没有更改,这允许可重复构建。
  • 如果有人对此有更好的想法,我会全力以赴。目前,我预计必须破解 ResolveEngine 的某些组合以使 ResolveReport 可用,然后添加自定义 DeliverEngine 以使用它。

【问题讨论】:

    标签: java build dependencies ivy dependency-management


    【解决方案1】:

    artifactreport> 可能会有所帮助。

    使用deliver任务创建一个ivy.xml,其中动态版本约束被静态版本约束替换(即[2.0,3.0[变成2.2.1):

    <ivy:deliver conf="*(public)" deliverpattern="${dist.dir}/ivy.xml"/>
    

    然后使用该文件上的解析任务来准备 artifactreport。

    <ivy:resolve file="${dist.dir}/ivy.xml"
                 conf="*(public)"
                 refresh="true"
                 type="ivy" />
    

    最后,artifactreport 会做瞬态依赖解析。

    <ivy:artifactreport tofile="${dist.dir}/artifactreport.xml" />
    

    artifactreport.xml 看起来像

    <modules>
    <module organisation="com.googlecode.flyway" name="flyway" rev="1.7" status="release"/>
    <module organisation="org.postgresql" name="postgresql-jdbc" rev="9.0" status="release"/>
    <module organisation="org.hibernate" name="hibernate" rev="3.3.2" status="release"/>
    <module organisation="org.apache.commons" name="commons-daemon" rev="1.0.2" status="release"/>
    ...
    

    使用 XSLT 生成 ivy.xml 表单。

    【讨论】:

      【解决方案2】:

      您正在寻找的功能已在 Ivy 2.4 中添加:fixdeps。它读取ivy.xml 文件,在这种情况下用作规范,并输出等效文件,例如ivy-resolved.xml,所有传递依赖都已解决。

      【讨论】:

      • 好吧,我需要它的时候已经晚了两年,但很高兴看到这个功能现在正确存在。
      【解决方案3】:

      在正常情况下,我会说这太过分了。您试图解决的问题是您的存储库不可靠......也许您应该考虑使用存储库管理器来管理您的存储库?

      (发布到 Maven Central 的工件是 deliberately never changed,这样可以确保使用存储库的人不会遇到构建不稳定)。

      说了这么多,如果您不能完全信任存储库模块配置,那么您可以使用 ivy artifactreport 任务来尝试执行此操作。它生成一个 XML 报告,可以使用 XSLT 将其转换为一个新的 ivy 文件。

      示例

      $ tree
      .
      |-- build.xml
      |-- ivy.xml
      `-- src
          `-- main
              `-- xsl
                  `-- artifactreport.xsl
      

      build.xml

      <project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
      
          <target name="init">
              <ivy:resolve/>
          </target>
      
          <target name="build" depends="init">
              <ivy:artifactreport tofile="build/reports/artifacts.xml"/>
      
              <xslt style="src/main/xsl/artifactreport.xsl" in="build/reports/artifacts.xml" out="build/ivy.xml"/>
          </target>
      
      </project>
      

      artifactreport.xsl

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
          <xsl:output method="xml" indent="yes"/>
      
          <xsl:template match="/">
              <ivy-module version="2.0">
                  <info organisation="com.myspotontheweb" module="demo"/>
      
                  <dependencies>
                      <xsl:apply-templates select="modules/module"/>
                  </dependencies>
      
              </ivy-module>
          </xsl:template>
      
          <xsl:template match="module">
              <dependency org="{@organisation}" name="{@name}" rev="{@rev}"/>
          </xsl:template>
      
      </xsl:stylesheet>
      

      【讨论】:

      • 我不是在谈论更改人工制品,正是出于这个原因,我们禁止这样做。我说的是影响版本分辨率的存储库的添加。假设我的依赖项之一依赖于 CoolLib[10.0, 12.0),并且在存储库中添加了维护版本 11.1。当这种情况发生时,我不希望我的构建(可能是一个固定的标记版本)发生变化,即使新版本显然满足了我的限制。 artifactreport 可能适用于此;我真的希望不必手动处理 Ivy 文件。
      • 啊,现在我明白了。出于这个原因,我不使用修订范围。有时,我会使用“latest.release”之类的动态修订,结合 ivy 交付任务来解决已发布的 ivy 文件的实际修订。
      猜你喜欢
      • 2016-05-14
      • 2014-10-15
      • 2011-11-13
      • 2011-10-05
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2011-11-02
      • 2010-12-07
      相关资源
      最近更新 更多