Intellij idea Intellij Idea中的共享SBT模块,无需本地发布

Intellij idea Intellij Idea中的共享SBT模块,无需本地发布,intellij-idea,sbt,Intellij Idea,Sbt,SBT项目A取决于B。这两个项目都有单独的VCS存储库,并有自己的生命周期,包括自动构建和测试 在Intellij Idea中有没有一种方法可以方便地处理这些项目 我所说的方便,主要是指: CMD Click指向项目之间实际的、可编辑的类,没有只读发布的jar 每次进行更改时,无需运行sbt publish local 断点按预期工作 如果依赖项被简单地声明为libraryDependencies,那么所有这些看起来都是不可能的。但是,声明与相对路径的关系将使构建系统失败。以下是对我有效的方

SBT项目
A
取决于
B
。这两个项目都有单独的VCS存储库,并有自己的生命周期,包括自动构建和测试

在Intellij Idea中有没有一种方法可以方便地处理这些项目

我所说的方便,主要是指:

  • CMD Click指向项目之间实际的、可编辑的类,没有只读发布的jar
  • 每次进行更改时,无需运行
    sbt publish local
  • 断点按预期工作

如果依赖项被简单地声明为
libraryDependencies
,那么所有这些看起来都是不可能的。但是,声明与相对路径的关系将使构建系统失败。

以下是对我有效的方法:

项目A中
创建了一个文件
local dependencies.sbt
(名称不重要),其中包含以下内容:

libraryDependencies ~= {l => l.filter(_.name != "my-utils")}
lazy val utils = RootProject(file("../my-utils"))
lazy val root = Project(id = "ProjectA", base = file(".")).dependsOn(utils)
第一行从
build.sbt
中定义的
libraryDependencies
中排除
my-utils
,这是自动生成所需的

现在
projecta
myutils
作为模块依赖项,而不是库依赖项,解决了上述问题

请注意,
local dependencies.sbt
仅用于本地环境,在VCS中应忽略,例如:

$ cat .hgignore

local-dependencies.sbt

创建IntelliJ Scala sbt项目
A

然后打开
build.sbt
并输入:

name := "A"
version := "0.1"
scalaVersion := "2.12.7"

lazy val b = (project in file("B"))

lazy val root = (project in file("."))
   .aggregate(b)
   .dependsOn(b)
保存这个。当在右下角的小对话框中询问“需要导入sbt项目”时,选择“启用自动导入”

IntelliJ现在自动创建子文件夹B,并在其中放置一个子文件夹。在子文件夹
B
中,为
B
创建一个新的
build.sbt
,其中包含:

sourceDirectory in Compile := (baseDirectory( _ / "src" )).value
保存后,创建新目录
B/src/scala
。 打开sbt的工具窗口(菜单:查看->工具窗口->sbt)。单击“刷新所有sbt项目”图标

将库scala文件添加到
B/src/scala


现在您有了一个多模块项目,由主模块a组成,具体取决于库子模块B。

应该能够导入这两个项目,然后替换依赖项以指向ide项目中的本地项目model@pfnSBT自动导入功能删除手动设置依赖项。以及手动导入将模块依赖项恢复回SBT配置。不幸的是,这是intellij中SBT结构插件的一个限制。是否可以引用其他项目的模块?