1

私は ant+ivy+nexus を使用して Java OSGi プロジェクトをビルドおよび公開しています (OSGi に慣れていない場合は、古き良き jar ファイルを使用してください)。新しい技術に取り組むときの通常の心とろける期間の後、私はほとんど機能するシステムを手に入れました。しかし、今ではアーティファクトのバリエーションには、スナップショット/リリースとメイン/テストの 2 つの側面があります。

main/test ディメンションは、それ自体が物語っています。スナップショット/リリースは、maven に適した方法で nexus に公開するために不可欠です。(オープンソースの OSGi ランタイムとの統合に非常に役立ちます)。したがって、プロジェクトごとに次のアーティファクトがあり、多くのプロジェクトがあります。

  • project-revision.xml (bp)
  • project-test-revision.xml (b)
  • project-revision-SNAPSHOT.xml (bp)
  • project-test-revision-SNAPSHOT.xml (b)

b = ビルドに成功 p = 公開に成功 (まだテスト用のものが正しく公開されていません)

ビルド スクリプトのあらゆる場所でコードを複製せずにここまでたどり着くまでにはしばらく時間がかかりましたが、なんとかやり遂げることができました... 1 つの大きな注意点があります。SNAPSHOT ブランチでは、すべてのリビジョンに「-SNAPSHOT」を追加します。ant ではプログラムでこれを実現できますが、ivy では複製された ivy.xml を使用しています。ivy-SNAPSHOT.xml。これは持っています

<info ... revision="x.x-SNAPSHOT">

-SNAPSHOT に注意してください。これがなければ、私は私のものを手に入れることができませんでした

<ivy:deliver>
<ivy:resolve>
<ivy:publish>

アーティファクトと maven pom を正しく公開するための一連のコマンド。(この Maven を使いやすくする必要があることを思い出してください...実際に Maven を使用して精神を構築することになったら、私は気が遠くなるでしょう!)

今、テスト/メイン ディメンションの導入に行き詰まっています。私は理想的には出版を目指しています

project-test-revision(-SNAPSHOT).jar

(オプションのスナップショットに注意してください)。私は本当に指定してこれをしたくありません

<info ... module="project-test" ... >

<info ... module="project" ... >さらに別のivyファイルとは対照的です。私がこの道を進んだ場合 (私はすでに始めたように)、単に大量の ivy-Option1-Option2...-OptionN.xml ファイルで終わるだけです。新しい 2 つの値のバリエーションごとに、ビルド ファイルと Ivy ファイルの数が 2 倍になります。それはがらくたです。もっと良い方法があるはずです。私はそれを見つけることができません。

1 つの ivy ファイルから名前が修飾された Ivy パブリッシング アーティファクトを正常に取得できた場合は、これを実現するための構成スニペットを投稿していただけませんか? 非常に便利です。(maven は設定を認識しないので、バリエーションをファイル名と pom に入れる必要があることを忘れないでください)。

どうもありがとう

アラステア

4

1 に答える 1

1

更新:アーティファクトを公開しました。テストconfでデフォルトのconfを拡張している間、少し苦労しました。公開中に、デフォルトの構成アーティファクトが存在しないという苦情がありました...テストケースのみを公開している間は気にしません。それらを独立させながらオーバーラップさせることで、公開する内容をきめ細かく制御できるようになります。

しかし!!!!!実行可能なテストpomはありません-それはまだ公開されていません。実際には公開されていますが、テスト以外のケースのデータが含まれています。したがって、これはまだMavenフレンドリーではありません。誰かがこれについて提案を持っているなら、それは素晴らしいことです。

いずれにせよ、私が現在使用しているコードは、それがあなたにも役立つ場合に備えて:

ivy.xml:

<info
    organisation="MY_ORGANISATION"
    module="MY_PROJECT"
    status="integration"
    revision="1.0-SNAPSHOT">
</info>
<configurations>
    <conf name="default" description="Default compilation configuration; main classes only" visibility="public"/>
    <conf name="test" description="Test-inclusive compilation configuration. Don't forget to also add Default compilation configuration where needed. This does not extend default conf" visibility="public"/>
</configurations>
<publications>
    <artifact name="MY_PROJECT type="jar" ext="jar" conf="default"/>  
    <artifact name="MY_PROJECT type="pom" ext="pom" conf="default"/>        
    <artifact name="MY_PROJECT-test" type="jar" ext="jar" conf="test"/>         
    <artifact name="MY_PROJECT-test" type="pom" ext="pom" conf="test"/>         
</publications>  
<dependencies>
    <dependency org="MY_ORGANISATION" name="ANOTHER_PROJECT" rev="1.0-SNAPSHOT" transitive="true" conf="*"/>
    <dependency org="junit" name="junit" rev="[4,)" transitive="true" conf="test->*"/>
</dependencies>

build.xml:

<property name="project.generated.ivy.file" value="SNAPSHOT_OR_RELEASE_IVY_XML_FILE" />
<property name="ivy.publish.status" value="RELEASE_OR_INTEGRATION" />
<property name="project.qualifier" value="-SNAPSHOT_OR_EMPTY" />
<property name="ivy.configuration" value="DEFAULT_OR_TEST" />

<target name="publish" depends="init-publish">                  
    <ivy:deliver 
      deliverpattern="${project.generated.ivy.file}" 
      organisation="${project.organisation}" 
      module="${project.artifact}" 
      status="${ivy.publish.status}" 
      revision="${project.revision}${project.qualifier}" 
          pubrevision="${project.revision}${project.qualifier}" 
          conf="${ivy.configuration}"
/>  

<ivy:resolve conf="${ivy.configuration}" />

<ivy:makepom 
    ivyfile="${project.generated.ivy.file}" 
    pomfile="${project.pom.file}"
/>

<ivy:publish 
    resolver="${ivy.omnicache.publisher}" 
    module="${project.artifact}"
    organisation="${project.organisation}"
    revision="${project.revision}${project.qualifier}"
    pubrevision="${project.revision}${project.qualifier}"
    pubdate="now" 
    overwrite="true"  
    publishivy="true" 
    status="${ivy.publish.status}"
    artifactspattern="${project.artifact.dir}/[artifact]-[revision](-[classifier]).[ext]"
    conf="${ivy.configuration}"                 
/>
        </target> 
于 2010-06-10T15:16:09.893 に答える