常春藤 - 将解析结果输出到常春藤文件

时间:2012-05-04 07:36:11

标签: java build dependencies ivy dependency-management

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

这与传递不同,传递(我相信)只会写出ivy.xml的直接依赖关系,而不是传递依赖关系。 deliver Ant任务确实具有delivertarget属性,该文件在文档中查找应该执行此操作。实际上它只适用于同一组织中的模块(通常不适用于所有依赖项)并为每个模块生成一个文件。

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

此处的上下文正在尝试启用可重复的可重现构建,包括存在更改(新库,版本)的情况。试图这样做的互联网周围有帖子,我发现没有一个可以正确地做到这一点。

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

3 个答案:

答案 0 :(得分:3)

artifactreport>可能有所帮助。

使用传递任务创建一个ivy.xml,其动态版本约束由静态版本约束替换(即[2.0,3.0 [变为2.2.1]:

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

然后使用该文件上的resolve任务为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表单。

答案 1 :(得分:1)

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

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

说完这一切之后,如果您无法完全信任存储库模块配置,那么您可以使用常春藤artifactreport任务尝试执行此操作。它生成一个XML报告,可以使用XSLT将其转换为新的常春藤文件。

实施例

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

答案 2 :(得分:1)

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