【问题标题】:How to set up a dependency between two Scala.js cross-projects in a multi-module build?如何在多模块构建中的两个 Scala.js 跨项目之间建立依赖关系?
【发布时间】:2018-05-19 09:46:21
【问题描述】:

假设我有两个子项目,lib1lib2build.sbts,看起来像这样:

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 设置的情况下完成这项工作?

【问题讨论】:

    标签: scala sbt scala.js


    【解决方案1】:

    如果我理解正确,您是在尝试dependsOn(交叉)在完全独立的构建中定义的项目?

    如果是这样,您需要的是ProjectRef。没有直接的CrossProjectRef,所以JVM和JS部分需要手动使用ProjectRefs。它看起来像:

    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 为时已晚。

    【讨论】:

    • 我基本上是在尝试避免在迭代库时必须通过本地常春藤存储库。 lib2 依赖于 lib1,两者都旨在用于其他项目。当前大项目构建中的一些子项目依赖于lib2,一些依赖于lib1。我尝试将两个库作为 git 子模块添加到主项目中,并在主构建中手动设置它们的内部依赖项以避免常春藤解析。
    • 那么你需要的确实是ProjectRefs。在这种情况下,您不需要在您的构建中声明来自lib2lib1 的依赖关系,因为lib2ProjectRef 将正确地从它自己的构建中解析lib2 的所有设置和设置,包括它对lib1的依赖。
    • 但我无法避免将lib1 放入lib2libraryDependencies,除非我在lib2 的构建文件中硬编码到它的相对路径,可以吗?这样的事情在 Maven 中非常简单,因为它首先会尝试解决多项目构建的模块中的所有依赖关系,然后如果仍然缺少某些依赖关系,它会尝试在外部找到它们。这允许将相同的构建文件重新用于将库发布到 repos 并在更大的项目中使用它们,从而完全避免 repo。到目前为止,使用 sbt 似乎根本不可能做到这一点。
    猜你喜欢
    • 2018-12-28
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2015-07-23
    • 2011-04-30
    • 2014-10-18
    相关资源
    最近更新 更多