26

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>

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

しかし、まだいくつかの問題があります。3 つの jar、openscada-utils.jar、openscada-utils-sources.jar、および openscada-utils-javadocs.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. 実際のリリースでは、依存関係のあるディストリビューションとないディストリビューションを作成したいのですが、どういうわけか、そのために異なる構成を使用できると思います。どうすればそれを有利に利用できますか?

4

4 に答える 4

10

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

<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>
于 2008-12-09T16:30:17.303 に答える
4

まず、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>

...
于 2012-01-13T16:28:00.813 に答える
3

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

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

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


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

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

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

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

于 2012-08-28T18:07:11.983 に答える
0

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

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

これを行う際に私が見つけた最大の落とし穴は、antによって実行されるときに、タスクivy:resolveとタスクの両方が同じクラスローダーによってロードされるという要件です。ivy:publishこれを確実に行う最も簡単な方法は、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"/>
于 2008-12-10T06:10:26.540 に答える