82

我正在开发几个相互依赖的模块,并希望在一个 IDEA 项目中一起使用它们。我正在使用sbt-idea从 sbt 构建定义生成 IDEA 项目,这对单个项目非常有用。然而,在多模块的情况下,到目前为止我尝试过的事情并不完全有效:

使用 sbt-idea 为每个模块独立生成一个 IDEA .iml 文件;然后从头开始创建一个主 IDEA 项目并将这些模块添加到其中。这使得模块源在同一个窗口中都是可编辑的,但它们之间的依赖关系没有被跟踪(因此尝试从foo项目中的某个源导航到bar中的某个东西会将我带到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 项目,其中跟踪了子项目之间的依赖关系。但是有两个警告:

  1. 子项目必须位于主项目的子目录中似乎是一个 sbt 限制(即,file("../foo")不允许)。这并不是我真正想要的(如果一个模块——例如“utils”或“commons”包——用于两个不同的主项目呢?)但我可以接受它。
  2. 我的一个子项目有自己的子项目;我不确定 sbt 本身是否正确处理这些嵌套项目,但无论如何它们都会被 sbt-idea 忽略。显然,我需要将嵌套子项目递归地包含在主项目中。

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

4

2 回答 2

7

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

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

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

如果您想在 Idea 中加载不属于当前项目的模块,这是可行的,因为您可以将其作为外部模块添加到工作区:

  • SBT-IDEA 为您的项目生成 .iml 文件,然后您将它们导入工作区
  • 您可以将其他项目的 other.iml 添加到工作区
  • 如果您修改了手动添加到工作区的外部 SBT 模块,您应该重新发布它们以在“主”项目上看到更改,该项目会看到这些外部模块是“libraryDependency”
于 2012-05-09T09:54:34.007 回答
7

It seems to be an sbt restriction that the subprojects must live in subdirectories of the master project (i.e., file("../foo") is not allowed). This is not really what I want (what if a module--such as a "utils" or "commons" package--is used in two different master projects?) but I can live with it.

With sbt 13.5 and intellij 13.x, you can specify inter-project dependency with relative path, using a Build.scala. Let's say you have two projects, a core project commons and another project foo, both living in a common directory code/

  1. create Build.scala under code/foo/project/
  2. put this code snippet 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. Generate your IntelliJ project via sbt by sbt gen-idea

于 2014-11-18T05:31:04.683 回答