假设我有两个子项目,lib1
和lib2
,build.sbt
,如下所示:
lazy val libX = crossProject.in(file(".")).settings(
... // a bunch of settings
).jvmSettings(
... // a bunch of settings
).jsSettings(
... // a bunch of settings
)
lazy val libXJVM = apiClient.jvm
lazy val libXJS = apiClient.js
我需要在另一个大型多模块项目中使用它们,以便lib2
取决于lib1
。
如果我在主build.sbt
中尝试此操作:
lazy val lib1 = crossProject.in(file("lib1"))
lazy val lib2 = crossProject.in(file("lib2")).dependsOn(lib1)
lazy val lib1JVM = lib1.jvm
...
然后项目依赖项似乎有效,但库内部build.sbt
文件(例如libraryDependencies
)的设置被完全忽略,构建失败。
如果我尝试这样做:
lazy val lib1JS = project.in(file("lib1"))
lazy val lib2JS = project.in(file("lib2")).dependsOn(lib1JS)
dependsOn
似乎被忽略了,lib2无法编译,因为它无法从lib1导入类型。
有没有办法在不重复主构建文件中的crossProject设置的情况下完成这项工作?
答案 0 :(得分:1)
如果我理解正确,您正在尝试dependsOn
(交叉)在完全独立的构建中定义的项目吗?
如果是这种情况,您需要的是ProjectRef
。没有CrossProjectRef
的直接,因此您需要为JVM和JS部件手动使用ProjectRef
。它看起来像是:
lazy val lib1JVM = ProjectRef(file("path/to/other/build", "lib1JVM")
lazy val lib1JS = ProjectRef(file("path/to/other/build", "lib1JS")
然后您可以依赖
lazy val myProject = crossProject
.jvmConfigure(_.dependsOn(lib1JVM))
.jsConfigure(_.dependsOn(lib1JS))
请注意,我不太明白您要对问题的lazy val lib2 = crossProject.in(file("lib2")).dependsOn(lib1)
部分做些什么。如果lib2
应该依赖于lib1
,则应该已经在lib2
的构建中声明了该依赖项。在重用lib1
和lib2
的较大的多模块构建中,将依赖项添加到来自其他构建的lib2
已为时已晚。