私は現在Mavenを使用して構築されているかなり普通のScalaプロジェクトを持っています。Scala 2.9.xと、バイナリまたはソース互換ではない次の2.10の両方をサポートしたいと思います。必要に応じてSBTへの変換を喜んで受け入れますが、いくつかの課題に直面しました。
このプロジェクトの私の要件は次のとおりです。
単一のソースツリー(分岐なし)。Scalaのバージョンごとに複数の同時「マスター」ブランチをサポートしようとすることが、ブランチ間のバグ修正を見逃す最も簡単な方法になると思います。
バージョン固有のソースディレクトリ。Scalaのバージョンはソースと互換性がないため、バージョン固有のソースの補助ソースディレクトリを指定できる必要があります。
バージョン固有のソースjar。エンドユーザーは、IDE統合用のScalaのバージョンについて、正しいバージョン固有のソースを含む正しいソースjarをダウンロードできる必要があります。
統合された展開。私は現在、Mavenリリースプラグインを使用して新しいバージョンをSonatype OSSリポジトリにデプロイしていますが、リリースについても同様に単純なワークフローが必要です。
エンドユーザーのMavenサポート。私のエンドユーザーは多くの場合Mavenユーザーであるため、依存関係を正確に反映する機能的なPOMが重要です。
影付きのjarサポート。依存関係のサブセットを含み、公開されたPOMから影付きの依存関係を削除するJARを作成できる必要があります。
私が試したこと:
Mavenプロファイル。Mavenビルドヘルパープラグインを使用してバージョン固有のソースツリーを選択し、ビルドに使用するScalaのバージョンを制御するMavenプロファイルのセットを作成しました。これは、公開するときまではうまく機能していました。
ソースjarにもカスタム分類子(「source-2.9.2」など)が必要であり、ほとんどのIDEツールはそれらを見つける方法を知らないため、分類子を使用してバージョンを修飾することはうまく機能しません。
Mavenプロパティを使用してSBTスタイルの_${scala.version}サフィックスをアーティファクト名に追加しようとしましたが、Mavenはアーティファクト名のプロパティが好きではありません。
SBT。これは、一度理解できればうまく機能します(豊富なドキュメントにもかかわらず、小さな作業ではありません)。欠点は、Mavenシェードプラグインに相当するものがないように見えることです。私が見た:
プロガード。プラグインはSBT0.12.x用に更新されておらず、groupIdsを変更した別のSBTプラグインに依存しており、古い名前で0.12.xバージョンがないため、ソースからビルドされません。プラグインの依存関係を無視/置換するようにSBTに指示する方法をまだ理解できていません。
OneJar。これは、カスタムクラスの読み込みを使用して、埋め込まれたjarからメインクラスを実行しますが、これは望ましい結果ではありません。プロジェクトのクラスファイルを、シェーディングされた依存関係からの(おそらく名前が変更された)クラスファイルと一緒にjarファイルに入れたいと思います。
SBTアセンブリプラグイン。これはある程度機能する可能性がありますが、POMファイルには、シェーディングしようとしている依存関係が含まれているように見えます。これは、エンドユーザーの助けにはなりません。
私は、Scalaに望むことを実行するソリューションがない可能性があること、および/または目標を達成するために独自のMavenまたはScalaプラグインを作成する必要がある可能性があることを認めます。しかし、可能であれば、既存の解決策を見つけたいと思います。
アップデート
@ Jon-Anderのすばらしい答えを受け入れるところですが、それでも私にとって傑出した作品が1つあります。それは、統一されたリリースプロセスです。build.sbtの現在の状態はGitHubにあります。(後世のために、後で回答で再現します)。
sbt-releaseプラグインは、マルチバージョンビルドをサポートしていません(つまり、+ release
希望どおりに動作しません)。これは、リリースタグ付けのプロセスが実際にはバージョン間で発生する必要がないため、一種の意味があります。ただし、プロセスの2つの部分、つまりテストと公開をマルチバージョンにしたいと思います。
私がしたいのは、2段階のmaven-release-pluginプロセスに似たものです。最初の段階では、Gitの更新とテストの実行という管理作業を行います。この場合+ test
、すべてのバージョンがテストされるように実行し、タグ付けし、スナップショットに更新してから、結果をアップストリームにプッシュします。
第2段階では、タグ付きバージョンとをチェックアウトし+ publish
ます。これにより、テストが再実行され、タグ付きバージョンがSonatypeリポジトリにプッシュされます。
これらのそれぞれを実行する値を記述できると思いますが、で複数の値をreleaseProcess
サポートできるかどうかはわかりません。それはおそらくいくつかの追加のスコープで動作する可能性がありますが、SBTのその部分はまだ私には奇妙なマジックです。releaseProcess
build.sbt
私が現在行っていることは、releaseProcess
公開しないように変更されています。次に、タグ付けされたバージョンを手動でチェックアウトし、+ publish
事後に実行する必要があります。これは、私が望むものに近いですが、妥協します。特に、テストはリリースプロセスの現在のscalaバージョンでのみ実行されるためです。Mavenプラグインのように2段階ではないが、マルチバージョンのテストと公開を実装するプロセスで生きることができます。
ラストマイルを超えて私を得ることができる追加のフィードバックをいただければ幸いです。