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

アーティファクトレポート>が役立つ場合があります。

配信タスクを使用して、動的バージョン制約が静的バージョン制約に置き換えられた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フォームを生成します。

于 2012-11-16T17:31:52.557 に答える
1

通常の状況では、これはやり過ぎだと思います。回避しようとしている問題は、リポジトリの信頼性が低いことです.....おそらく、リポジトリマネージャを使用してリポジトリを管理することを検討する必要がありますか?

(Maven Centralに公開されたアーティファクトは意図的に変更されることはありません。これにより、リポジトリーを使用しているユーザーがビルドの不安定性に遭遇することがなくなります)。

とはいえ、リポジトリモジュールの構成を完全に信頼できない場合は、 ivyartifactreportタスクを使用して実行しようとしていることが可能です。XSLTを使用して新しいivyファイルに変換できるXMLレポートを生成します。

$ 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>
于 2012-05-05T00:29:28.833 に答える
1

探している機能はIvy2.4で追加されました:fixdepsivy.xmlこの場合は仕様として機能するファイルを読み取り、ivy-resolved.xmlすべての推移的な依存関係が解決された同等のファイルを出力します。

于 2018-07-16T15:23:32.900 に答える