我想在intellij中同时处理多个sbt项目。项目是“单向依赖”,意味着一个是(可重用)核心,另一个是构建在该核心上的实际应用程序。两者目前都在开发中。
我希望核心驻留在除应用程序之外的另一个基本/根目录中,因此:
- /core
-- build.sbt
- /application
-- build.sbt
我希望能够
到目前为止,我尝试过哪些问题以及遇到了哪些问题:
设置如
lazy val core = project.in(file("../core"))
lazy val application = project.in(file(".")).dependsOn(core)
不起作用,因为sbt断言多项目设置中的每个项目的目录都包含在同一个构建根目录中:
SBT java.lang.AssertionError:断言失败:构建根/应用程序
中不包含目录/核心
设置如
lazy val core = RootProject(file("../core"))
lazy val application = project.in(file(".")).dependsOn(core)
不是解决方案,因为:
现在我是一个新手,我猜(并希望)必须有解决这个问题的方法。我不可能是唯一一个想要在没有包装层的情况下分离我的项目但仍然可以在我选择的IDE中修改它们的人。
编辑
@ OlegRudenko的解决方案对我来说是半工作的。由于core
也有一些依赖关系,我无法在application
中编译或使用它。
core
引入一些依赖关系,例如记录器,当我在application
并尝试使用core
的组件时,编译器会尖叫我,因为它无法在core
中找到依赖项(例如记录器)
另外,core
拉入,例如lwjgl和我想在application
中使用它的一些组件,没有机会,因为它无法找到core
的依赖项的包。
现在我所做的是一个黑客的非解决方案。我只是在同一个intellij项目中开发core
和application
并保持git-repo私有。
这根本不是一个解决方案,因为我想开源core
,而application
现在是封闭源代码,我仍然希望同时处理这两个问题,优化{{ 1}}等等。
答案 0 :(得分:7)
如果某个框架不允许我这样做,我宁愿不打架而是要找到妥协。
SBT不允许在项目根目录之外拥有子项目。 所以我的解决方案是在我的项目中创建一个符号链接到子项目,它位于外面:
common/
common/core/ - I want this as a sub-project inside of my project
application/
application/ui/ - This is my project
application/ui/core/ -> ../../common/core/ - This is my goal
必须
解决方案是将以下行添加到SBT文件中:
val __createLinkToCore = {
import java.nio.file.{FileSystemException, Files, Paths}
import scala.util.Try
val corePath = Paths.get("..", "..", "common", "core")
if(!Files.exists(corePath)) throw new IllegalStateException("Target path does not exist")
val linkPath = Paths.get("core")
if(Files.exists(linkPath)) Files.delete(linkPath)
Try {Files.createSymbolicLink(linkPath, corePath)}.recover {
case cause: FileSystemException if System.getProperty("os.name").toLowerCase.contains("windows") =>
val junctionCommand = Array("cmd", "/c", "mklink", "/J", linkPath.toAbsolutePath.normalize().toString, corePath.toAbsolutePath.normalize().toString)
val junctionResult = new java.lang.ProcessBuilder(junctionCommand: _*).inheritIO().start().waitFor()
if(junctionResult != 0) throw new Exception("mklink failed", cause)
linkPath
}.get
}
每次启动SBT时,但在对代码执行任何操作之前 - 在编译之前执行此操作等等。它不会在每次编译时重新创建链接 - 每次SBT启动时只会重建一次。
代码确实如下:
mklink /J
此解决方案的限制:
答案 1 :(得分:3)
我不认为这在SBT中是可行的(但我很乐意听到其他情况)。
以下是我在IntelliJ中为解决此问题所做的工作:
答案 2 :(得分:1)
您可以使用 ProjectRef :
lazy val my_application = (project in file ("."))
.aggregate(my_core)
.dependsOn(my_core)
lazy val my_core = ProjectRef(file("../my_core"), "my_core")
然后,关于目录结构,my_application
和my_core
是兄弟姐妹。