web-dev-qa-db-ja.com

SBTとIntelliJ IDEAで複数の相互依存モジュールを管理する方法は?

私はそれらの間に依存関係を持ついくつかのモジュールを開発しており、1つのIDEAプロジェクトで一緒に作業したいと思います。 sbt-idea を使用して生成していますIDEA sbtビルド定義からのプロジェクト。個々のプロジェクトに最適です。ただし、複数モジュールの場合、これまで試したことがうまくいきません。

sbt-ideaを使用してIDEA .imlファイルをモジュールごとに個別に生成します;次にマスターを作成しますIDEAプロジェクトを最初から作成し、それらのモジュールを追加します。これにより、モジュールのソースはすべて同じウィンドウで編集可能になりますが、それらの間の依存関係は追跡されません(したがって、foobarにあるものに投影すると、ローカルソースではなくbarのインポートされたライブラリバージョンに移動します)。

sbt マルチプロジェクトビルド (別名サブプロジェクト)を使用します。ここで、親プロジェクトのBuild.scalaには次のようなものが含まれます。

_lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)
_

Sbt-ideaがマスターIDEAプロジェクトを生成し、サブプロジェクト間の依存関係を追跡するという点で、これはほとんど機能します。ただし、2つの注意点があります。

  1. サブプロジェクトはマスタープロジェクトのサブディレクトリに存在する必要があるというsbtの制限のようです(つまり、file("../foo")は許可されません)。これは実際には私が望むものではありません(「utils」または「commons」パッケージなどのモジュールが2つの異なるマスタープロジェクトで使用されている場合はどうなりますか)。
  2. 私のサブプロジェクトの1つには、独自のサブプロジェクトがあります。 sbt自体がこれらのネストされたプロジェクトを正しく処理するかどうかはわかりませんが、いずれにしてもsbt-ideaによって無視されます。もちろん、ネストされたサブプロジェクトをマスタープロジェクトに再帰的に含める必要があります。

要約すると、モジュールを収集したい既にサブプロジェクトを持っている可能性があるを1つの大きなIDEA便利な編集のために追跡された依存関係を持つプロジェクト。 !

80
David Soergel

マルチプロジェクトビルドのアプローチは正しいものです。任意の長さのサブプロジェクトのネストされたツリーを持つことができますが、複数の親プロジェクトに属するモジュールを持つことはできません。これは絶対に理にかなっており、Mavenでも同じことが起こります。

その理由は、同じモジュールを複数のプロジェクトに組み込み、ソースの同期を維持するのが難しいためです。通常のワークフローは次のとおりです。

  • モジュールが属するプロジェクトがあり、モジュールのソースを変更します。
  • モジュールをローカルリポジトリに公開します
  • モジュールが必要な他のプロジェクトでは、libraryDependencyとして宣言します

しかし、Idea内の現在のプロジェクトに属していないモジュールをロードする場合は、これを外部モジュールとしてワークスペースに追加できるため、これは実行可能です。

  • SBT-IDEAはプロジェクトの.imlファイルを生成し、ワークスペースにインポートします
  • ワークスペースに他のプロジェクトのother.imlを追加できます
  • ワークスペースに手動で追加した外部SBTモジュールを変更する場合は、それらを再発行して、「main」プロジェクトで変更を取得する必要があります。これらの外部モジュールは「libraryDependency」であることがわかります
7
Edmondo1984

サブプロジェクトはマスタープロジェクトのサブディレクトリに存在する必要があるというsbtの制限のようです(つまり、file( "../ foo")は許可されません)。これは実際に私が望むものではありません(「utils」または「commons」パッケージなどのモジュールが2つの異なるマスタープロジェクトで使用されている場合はどうなりますか?).

Sbt 13.5およびintellij 13.xでは、Build.scalaを使用して、相対パスでプロジェクト間の依存関係を指定できます。コアプロジェクトcommonsと別のプロジェクトfooの2つのプロジェクトがあり、どちらも共通のディレクトリcode /にあるとします

  1. code/foo/project /の下にBuild.scalaを作成します
  2. このコードスニペットinsde Build.scala

    object ProjectDependencies {
        val commons = RootProject(file("../commons"))
    }
    
    object ProjectBuild extends Build {
        import ProjectDependencies._
    
        lazy val root = Project(id = "foo", base = file(".")).dependsOn(commons)
    }
    
  3. sbt gen-ideaによってsbt経由でIntelliJプロジェクトを生成します

7
user2829759