2016-05-16 4 views
0

SBTによって管理されるスケーラプロジェクトがあります.SBTには、独自のコードにリンクするアダプタであるいくつかのクラスが含まれています。これらはリンクされたライブラリの配布を妨げる商用ライセンスと、自分で作成したアダプタコードを持っています。独自のコードを分離するためにJVMプロジェクトを構成する方法は?

理論上私のプロジェクトをオープンソースとして配布できるように、これらのアダプタを他のコードと分離したいと思います。私は各アダプタが確実にする必要があります

  • 別にバージョン管理されています。
  • (Cプロジェクトで ./configureを実行しているとき --with-xxxの種類など)を
  • が選択的にコンパイル& JARの作成中にオン/オフを切り替えることができます

このような何かのディレクトリ構造はどのようなものになるはずですか? SBTプロジェクトはどうですか?可能であれば、通常のGradleディレクトリ構造に準拠したいと思います。

各アダプタはコアプロジェクトに依存している(つまり、メインプロジェクトで定義されているAdapterインターフェイスを継承します)、コアプロジェクトは個々のアダプタによって異なります。だから私は、アダプタコードからコアコードを分離しながら、循環依存を避けるためにこれを設定する方法がわかりません。

+0

がメインのソースコードのコンパイルやテストだけのために必要な中核事業上のアダプタの依存関係はありますか? – Teliatko

答えて

1

それはこの方法で達成することができる。

  1. は、新しいモジュールの特殊なアダプタ-API」に「コア」モジュールからアダプタ・インターフェースを抽出し、
  2. 'コア'モジュールとすべてのアダプタ実装モジュールの依存関係として宣言します。
  3. アダプタ実装モジュールの依存関係として 'コア'を宣言します。
  4. 各モジュールは別々にバージョン管理できます。
  5. アダプター実装モジュールは別々にパッケージ化されています。

プロジェクトレイアウト:

root 
├── adapter-a 
│   └── src 
│    └── main 
│     ├── resources 
│     └── scala 
├── adapter-api 
│   └── src 
│    └── main 
│     ├── resources 
│     └── scala 
├── adapter-b 
│   └── src 
│    └── main 
│     ├── resources 
│     └── scala 
└── core 
    └── src 
     └── main 
      ├── resources 
      └── scala 

build.sbt:

lazy val root = project 
    .in(file(".")) 
    .aggregate(adapterApi, core, adapterA, adapterB) 

lazy val adapterApi = project 
    .in(file("adapter-api")) 
    .settings(
    version := "1.0" 
) 

lazy val core = project 
    .in(file("core")) 
    .dependsOn(adapterApi) 
    .settings(
    version := "1.5" 
) 

lazy val adapterA = project 
    .in(file("adapter-a")) 
    .dependsOn(adapterApi, core) 
    .settings(
    version := "1.2" 
) 

lazy val adapterB = project 
    .in(file("adapter-b")) 
    .dependsOn(adapterApi, core) 
    .settings(
    version := "1.0" 
) 
+0

ありがとう@thirstycrow;これは最初の箇条書きポイントに答えます。これは第2弾にどのように答えますか? sbtコンソールから 'publish'を実行すると、プロジェクト全体を1つのjarファイルにパッケージ化するのではないでしょうか?リリース用にパッケージングするときに、各アダプタを選択/除外する方法についてはどうすればよいでしょうか? – Luciano

+0

@ Luciano各プロジェクトは、依存関係のないパッケージになっています。 fatal jarをビルドするためにsbt-assemblyプラグインを使用することはできますが、これはデフォルトの動作ではありません。 – thirstycrow

+0

物事を少しきれいにするには、 'git submodule'コマンドを使ってソース管理に1つの 'root'リポジトリを作成し、個別に除外/バージョン管理する個別の 'adapter' reposを作成することもできます。 – Luciano

関連する問題