7

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

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

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

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

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

3 回答 3

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 表单。

于 2012-11-16T17:31:52.557 回答
1

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

(故意发布到 Maven Central 的工件从不更改,这确保使用存储库的人不会遇到构建不稳定)。

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

例子

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

构建.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>

工件报告.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>
于 2012-05-05T00:29:28.833 回答
1

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

于 2018-07-16T15:23:32.900 回答