如何在多模块构建中设置两个Scala.js交叉项目之间的依赖关系?

时间:2017-12-05 16:44:53

标签: scala sbt scala.js

假设我有两个子项目,lib1lib2build.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设置的情况下完成这项工作?

1 个答案:

答案 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的构建中声明了该依赖项。在重用lib1lib2的较大的多模块构建中,将依赖项添加到来自其他构建的lib2已为时已晚。