如何用SBT和IntelliJ IDEApipe理多个相互依赖的模块?

我正在开发几个与它们之间的依赖关系的模块,并希望在一个IDEA项目中一起使用它们。 我正在使用sbt-idea从sbt构build定义生成IDEA项目,这对于单个项目非常有用。 然而,在多模块的情况下,我迄今为止所尝试的东西并不完全正常:

使用sbt-idea独立地为每个模块生成一个IDEA .iml文件 ; 然后从头开始创build一个主IDEA项目并将这些模块添加到它。 这使得模块的源代码在同一个窗口中都是可编辑的,但是它们之间的依赖关系没有被跟踪(所以试图从foo项目中的某个源代码导航到bar中的某些东西将我带到导入的库版本,而不是本地源代码)。

使用sbt 多项目构build (也称为子项目) ,其中父项目的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项目,并跟踪所有子项目之间的依赖关系。 有两个警告:

  1. 子项目必须存在于主项目的子目录中(即不允许使用file("../foo")似乎是一种限制。 这实际上并不是我想要的(如果在两个不同的主项目中使用某个模块,比如“utils”或“commons”包),但是我可以忍受。
  2. 我的一个子项目有自己的子项目; 我不确定sbt本身是否正确处理这些嵌套的项目,但无论如何,它们被sbt-idea忽略。 显然我需要嵌套子项目recursion包含在主项目中。

总结一下:我想将可能已经有子项目的模块收集到一个大的IDEA项目中,并进行跟踪,以便编辑。 我该怎么做? 谢谢!

子项目必须存在于主项目的子目录中(即不允许使用file(“../ foo”))似乎是一种限制。 这实际上并不是我想要的(如果在两个不同的主项目中使用某个模块,比如“utils”或“commons”包),但是我可以忍受。

使用sbt 13.5和intellij 13.x,您可以使用Build.scala指定相对path的项目间依赖关系。 假设你有两个项目,一个是核心项目公用程序和另一个项目foo ,它们都生活在一个共同的目录代码/

  1. 在code / foo / project /下创buildBuild.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生成你的IntelliJ项目

多项目构build的方法是正确的。 您可以拥有任意长度的子项目的嵌套树,但不能拥有属于多个父项目的模块。 这是绝对有道理的,在Maven中也是一样的。

原因是很难将同一个模块放到多个项目中并保持源代码的同步。 一个正常的工作stream程如下:

  • 您有一个模块所属的项目,您可以在其中修改模块源。
  • 您将模块发布到您的本地存储库
  • 在其他需要模块的项目中,将其声明为libraryDependency

如果你想加载一个不属于Idea内部当前项目的模块,这是可行的,因为你可以将它作为外部模块添加到工作空间中:

  • SBT-IDEA为您的项目生成.iml文件,并将其导入到工作区中
  • 您可以将其他项目的other.iml添加到工作区
  • 如果修改了手动添加到工作区的外部SBT模块,则应该重新发布它们以获取“main”项目上的可见更改,这会看到这些外部模块是“libraryDependency”