Sor*_*ona 8 dependencies scala intellij-idea multi-project sbt
我想在intellij中同时处理多个sbt项目.项目是"单向依赖",意味着一个是(可重用)核心,另一个是构建在该核心上的实际应用程序.两者目前都在开发中.
我希望核心驻留在除应用程序之外的另一个基本/根目录中,因此:
- /core
-- build.sbt
- /application
-- build.sbt
Run Code Online (Sandbox Code Playgroud)
我希望能够
我尝试了什么,到目前为止我发现了哪些问题:
设置如
lazy val core = project.in(file("../core"))
lazy val application = project.in(file(".")).dependsOn(core)
Run Code Online (Sandbox Code Playgroud)
因为sbt断言多项目设置中的每个项目的目录都包含在同一个构建根目录中,所以不起作用:
sbt java.lang.AssertionError:断言失败:构建根/应用程序中不包含目录/核心
设置如
lazy val core = RootProject(file("../core"))
lazy val application = project.in(file(".")).dependsOn(core)
Run Code Online (Sandbox Code Playgroud)
不是解决方案,因为:
现在我是一个新手,我猜(并希望)必须有一个解决这个问题的方法.我不可能是唯一一个想要在没有包装层的情况下分离我的项目并且仍然可以在我选择的IDE中修改它们的人.
编辑:
@ OlegRudenko的解决方案对我来说是半工作的.由于core
还有一些依赖项,我无法编译或使用它application
.
core
application
引入一些依赖项,例如Logger,当我进入并尝试使用core
编译器的组件时,我会尖叫,因为它无法找到依赖项core
(例如记录器).
另外,core
拉入例如lwjgl并且我想使用它的一些组件application
,没有机会,因为它无法找到该依赖项的包core
.
现在我所做的是一个hacky非解决方案.我只是开发都core
和application
在同一的IntelliJ项目,并保持git的回购专用.
这根本不是一个解决方案,因为我想在开源core
时暂时application
关闭源代码,我仍然想同时处理这两个问题,改进core
等等.
如果某个框架不允许我做什么,我宁愿不打架而是寻求妥协.
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
Run Code Online (Sandbox Code Playgroud)
它必须
解决方案是将以下行添加到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
}
Run Code Online (Sandbox Code Playgroud)
它在每次启动SBT时执行,但在对代码执行任何操作之前 - 编译之前执行等等.它不会在每次编译时重新创建链接 - 每个SBT启动一次.
代码确实如下:
mklink /J
此解决方案的限制:
我认为这在 SBT 中是不可能的(但我很想听听其他情况)。
\n\n以下是我在 IntelliJ 中为解决此问题所做的操作:
\n\n 归档时间: |
|
查看次数: |
2272 次 |
最近记录: |