web-dev-qa-db-ja.com

ivy:publishはどのように機能しますか?

Antタスクivy:publishがどのように機能するのか完全に途方に暮れています。

大量のjarファイルを作成する通常のビルドを実行してから、それらのjarを(ローカル)リポジトリにプッシュすることを期待します。

ビルドされたjarをどこから取得するかをどのように指定できますか?また、それらはどのようにしてリポジトリに格納されますか?

更新:

<target name="publish-local" description="--> Publish Local">
    <ivy:retrieve />
    <ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true">
        <artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" />
    </ivy:publish>
</target>

これは実際に機能します。以前は取得を含めませんでした。

しかし、まだいくつかの問題があります。openscada-utils.jar、openscada-utils-sources.jar、openscada-utils-javadocs.jarの3つのjarをopenscada-utils-0.9.2.jar、openscada-utilsとして公開したいとします。 -0.9.2-sources.jarおよびopenscada-utils-0.9.2-javadocs.jar

実際の名前がどのように組み立てられているのか、どこでどの名前を取得するのかを指定できるのか、私には完全にはわかりません。 (上記のフラグメントを使用すると、jarは常にutils.jarのみと呼ばれます)。

更新1:

私はそれを(少し)動作させましたが、それでも正しく感じられません。どういうわけか、すべてのチュートリアルはサードパーティプロジェクトからの依存関係に焦点を当てていますが、私にとって同様に重要なポイントは、プロジェクト固有の依存関係を処理することです。

さまざまな方法で相互に依存しているサブプロジェクトがたくさんあります。 ivy:publishを考えると、どのように始めるかは私にはわかりません。

  1. 最初のバージョンをどのように処理しますか?すべてのサブプロジェクトに共通のバージョン番号があり、それらが一緒に属していることを示しています(たとえば0.9)。したがって、最初のリビジョンは0.9.0である必要がありますが、これまでのところ、私のプロジェクトはリポジトリにありません。 Ivyにこのリビジョン番号を割り当てるにはどうすればよいですか。

  2. 開発の過程で、これまでのリビジョン番号を変更せずに、ビルドされたファイルを再度公開したいと思います。

  3. 作業が終了したら、それを共有リポジトリにプッシュしたい(そして、リビジョン番号を0.9.0から0.9.1に増やしたい)場合、推奨されるアプローチは何ですか?

  4. 実際のリリースでは、依存関係のあるディストリビューションとないディストリビューションを作成したいのですが、どういうわけか、そのためにさまざまな構成を使用できると思います。どうすればそれを自分の利益のために使うことができますか?

25
Mauli

「リゾルバ」を指定する必要があります。何かのようなもの:

<ivy:publish resolver="local" pubrevision="1.0"/>

それはパターンによって制御されます。この ページ はそれをかなりうまくカバーしています。あなたがあなたになりたいように見えます:

<artifacts pattern="${dist.dir}/[organisation]-[module]-[revision]-[type].[ext]" />

また、ivy.xmlファイルで3つのjarをアーティファクトとして識別する必要があります。このようなもの:

<publications>
    <artifact name="utils"/>
    <artifact name="utils" type="source"/>
    <artifact name="utils" type="javadocs"/>
</publications>
10
sblundy

まず、ivy.xmlファイルが必要です。

<ivy-module version="2.0">
    <info organisation="com.example.code" module="MyProject"
         revision="${project.revision}"/>
    <configurations>
        <conf name="runtime" description="" />
        ... other config elements here...
    </configurations>

    <publications defaultconf="runtime">
        <artifact name="MyProject" type="jar" ext="jar" conf="runtime" />
    </publications>

    <dependencies>
        ...
    </dependencies>
</ivy-module>

Ivy.xmlのinfo要素とpublications要素を使用すると、build.xmlのivy要素のさまざまな属性をスキップできます。

Ivy.xmlの$ {project.revision}に注意してください。プロパティにはbuild.xmlで値が指定されていますが、これはうまく機能しているようです。リビジョンは、必要な値を簡単に持つことができます(たとえば、ナイトリービルドとローカルビルド)。

これは、build.xmlファイルを設定する方法のサンプルです。

<property name="project.revision" value="1.0.0"/>

...

<target name="ivy">
    <ivy:resolve />

    <!-- Possible ivy:report, ivy:retrieve and other
    elements for managing your dependencies go here -->

    <ivy:deliver conf="*(public)"/> 
</target>

<target name="publish" depends="clean, ivy, jar">
    <ivy:publish resolver="local">
        <!-- possible artifacts elements if your artifacts
        are not in standard location -->
    </ivy:publish>
</target>

...
4
Peter Lamberg

最初に<ivy:deliver/>タスクを実行することになっています。これにより、Ivyリポジトリで使用できるivy.xmlファイルが作成されます。

<ivy:publish>を使用する場合は、resolverパラメーターで指定することにより、公開するリポジトリーを指定します。これは、ivy.settings.xmlファイルのリゾルバー名と一致する必要があります。

アーティファクトを実際に指定するのではなく、公開するアーティファクトを見つけるパターンを指定します。これは、<artifacts>タスクの<ivy:publish>サブタスクを介して指定します。たとえば、私たちのように${basedir}/target/archiveディレクトリの下にすべてをビルドする場合、次のように指定できます。

<ivy:publish resolver="public">
   <artifacts path="target/archive/[artifact].[ext]"/>
</ivy:publish>

ファイルのリビジョン番号を変更する場合は、<ivy:publish>タスクのpubrevisionパラメーターを使用できます。これはivy.xmlを更新しませんが、jar/warsを正しいリビジョンに公開します。 <ivy:deliver>タスクのpubrevisionパラメーターを使用して、とにかく正しいivy.xmlファイルを作成することをお勧めします。次に、<ivy:publish>は私のivy.xmlファイルのリビジョンを使用します。

<ivy:retrieve>を実行する必要はありません。結局のところ、新しいjarを作成するためにビルドを実行しているので、ビルドのどこかにあるはずです。それ以外の場合、jarまたはwarを作成していない場合、Ivyリポジトリに何を公開しようとしていますか?そして、あなたは確かにそれを再公開するためだけにあなたのIvyリポジトリにすでにあるものを取得したくないでしょう。


私の哲学は、公開はCMタスクであり、ビルド手順の一部として実行すべきではないということです。したがって、<ivy:deliver>または<ivy:publish>は使用しません。

ArtifactoryをIvyリポジトリ(およびMavenリポジトリ)として使用します。継続的なビルドサーバーとして Jenkins を使用します。

私がやっていることは、開発者にpom.xmlタスクを介してivy.xmlファイルから<ivy:makepom>ファイルを作成させることです。これとビルドjar/warsは、アーカイブされたアーティファクトとしてJenkinsに保存されます。

特定のビルドに満足し、それをパブリックリポジトリに配置したい場合は、JenkinのPromote Buildタスクを使用して、pom.xmlを使用して特定のjar/warをArtifactoryリポジトリにプロモートします。これを行うには、mvn deploy:deploy-fileタスクを使用します。

2
David W.

ここでツタが何をしているのかを理解することが重要です。アーティファクトjarをivyリポジトリにコピーするだけでなく、各アーティファクトのすべての依存関係を指定する関連する「.ivy.xml」ファイルも生成します。

裏で、ivy:retrieveタスクは実際にはivy:resolveもトリガーしています。そのivy:resolveが発生すると、ファイルがローカルのivyキャッシュ(.ivyuser.homeフォルダー内)に書き込まれ、解決がどのように行われたか(解決を完了するために必要なモジュールのリビジョン)が指定されます。 。)ivy:publishが検出されると、その解決レコードがキャッシュから取得され、アーティファクトのivy.xmlを生成するために使用されます。

これを行う際に私が見つけた最大の落とし穴は、ivy:resolveタスクとivy:publishタスクの両方がantによって実行されるときに同じクラスローダーによってロードされるという要件です。これを確実に行う最も簡単な方法は、taskdefタスクでloaderRefを使用することです。例(一致するloaderRefタグに注意してください):

<taskdef name="ivy-retrieve" 
     classname="org.Apache.ivy.ant.IvyRetrieve" 
     classpathref="ivy.lib" 
     loaderRef="ivy.loader"/>
<taskdef name="ivy-publish" 
     classname="org.Apache.ivy.ant.IvyPublish" 
     classpathref="ivy.lib" 
     loaderRef="ivy.loader"/>
0
Jared