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


82

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

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

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

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

要約すると、すでにサブプロジェクトが含まている可能性のあるモジュール、編集しやすいように依存関係を追跡した1つの大きなIDEAプロジェクトに収集したいと思います。どうすればいいですか?ありがとう!


2
他のプロジェクトを外部プロジェクト参照としてリンクするメタプロジェクトを設定してみてください(github.com/harrah/xsbt/wiki/Full-Configuration)。私はsbt-ideaでこれを自分で試したことがないので、これは答えではなくコメントです。
レトロニム2012年

アイデアをありがとう-しかし悲しいことにsbt-ideaは外部参照を完全に無視します。
David Soergel 2012年

たぶんこれはsbt-ideaの次のバージョンで役立つでしょう:github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
レトロニム

かっこいいので、最新のgitソースからsvn-ideaをインストールしてそれらの変更をプルし、プロジェクトをクリーンアップしてsbt-ideaを再度実行しました。私が完全には理解していない奇妙な依存関係解決の問題がいくつかありましたが、どういうわけか私は作業プロジェクトに行き着きました!サブサブプロジェクトのIDEAでソースディレクトリを手動で設定する必要がありました。振り返ってみると、そもそもストックsbt-idea11.1でそれができなかったのかどうかはわかりません。とにかく、ありがとう-私は今のところこのヤクを剃るのをやめることができると思います。
David Soergel 2012年

その最後のコメントを書いた後、私は結局、作業中のプロジェクトがないことに気づきました(ここでも、サブサブプロジェクトの問題)。だから私はそれらをファーストクラスのプロジェクトに分けたので、私のマスタープロジェクトにはその下に1レベルのサブプロジェクトしかありません。もちろん、それができるのは、そもそもこれがすべて私自身のコードだからです。
David Soergel 2012年

回答:


7

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

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

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

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

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

入力ありがとうございます。ただし、問題は、「任意の長さのサブプロジェクトのネストされたツリーを持つことができる」ということではないということです。これはsbtで機能するはずですが、sbt-ideaは結果のIDEAプロジェクトファイルにサブサブプロジェクトを含まないようです。
David Soergel 2012年

この制限はアイデアによるものですか?
Edmondo1984 2012

いいえ、私は確かにIDEAプロジェクト階層を数レベル深くしました。
David Soergel 2012

7

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

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

  1. code / foo / project /の下にBuild.scalaを作成します
  2. このコードスニペットを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を介してIntelliJプロジェクトを生成する sbt gen-idea


これにより、「foo」からリンクして「commons」ソースを編集できるようになりますか?
tjunkie 2015

はい、できます。そしてそれは私のsbt0.13.7とintellij14.0.3のインストールで動作します
user2829759 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.