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

Dav*_*gel 82 scala intellij-idea sbt sbt-idea

我正在开发几个具有依赖关系的模块,并希望在一个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)
Run Code Online (Sandbox Code Playgroud)

这几乎可以工作,因为sbt-idea生成了一个主IDEA项目,其中跟踪了子项目之间的依赖关系.但有两点需要注意:

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

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

Edm*_*984 7

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

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

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

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

  • SBT-IDEA为您的项目生成.iml文件,并在工作区中导入它们
  • 您可以将other.iml的其他项目添加到工作区
  • 如果修改已手动添加到工作空间的外部SBT模块,则应重新发布它们以使"主"项目上的更改可见,这看到那些外部模块是"libraryDependency"


use*_*759 7

子项目必须存在于主项目的子目录中(即不允许使用文件("../ foo"))似乎是一种限制.这不是我想要的(如果一个模块 - 例如"utils"或"commons"包 - 在两个不同的主项目中使用会怎么样?)但是我可以忍受它.

使用sbt 13.5和intellij 13.x,您可以使用Build.scala指定具有相对路径的项目间依赖.假设您有两个项目,一个核心项目公共项目和另一个项目foo,两者都存在于一个公共目录代码中/

  1. 在代码/ 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)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过sbt by生成IntelliJ项目 sbt gen-idea