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

如何在多模块构建中设置两个Scala.js交叉项目之间的依赖关系?,scala,sbt,scala.js,Scala,Sbt,Scala.js,假设我有两个子项目,lib1和lib2,带有build.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

假设我有两个子项目,
lib1
lib2
,带有
build.sbt
s,如下所示:

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

如果我在main
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导入类型


有没有办法在不复制主生成文件中的交叉项目设置的情况下实现此功能?

如果我理解正确,您正在尝试依赖于在完全独立的生成中定义的(交叉)项目

如果是这样,你需要的是。没有直接的
CrossProjectRef
,因此您需要为JVM和JS部件手动使用
ProjectRef
s。它看起来像:

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(文件(“lib2”)).dependsOn(lib1)
部分做什么。如果
lib2
应该依赖于
lib1
,那么该依赖关系应该已经在
lib2
的构建中声明。在重用
lib1
lib2
的更大的多模块构建中,向来自另一个构建的
lib2
添加依赖项为时已晚。

如果我理解正确,您正试图依赖于在完全独立的构建中定义的
项目

如果是这样,你需要的是。没有直接的
CrossProjectRef
,因此您需要为JVM和JS部件手动使用
ProjectRef
s。它看起来像:

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(文件(“lib2”)).dependsOn(lib1)
部分做什么。如果
lib2
应该依赖于
lib1
,那么该依赖关系应该已经在
lib2
的构建中声明。在重用
lib1
lib2
的更大的多模块构建中,向来自另一个构建的
lib2
添加依赖项为时已晚。

在对库进行迭代时,我基本上是在试图避免必须通过本地常春藤存储库。lib2依赖于lib1,两者都打算在其他项目中使用。当前大项目构建中的一些子项目依赖于lib2,一些依赖于lib1。我尝试将这两个lib作为git子模块添加到主项目中,并在主构建中手动设置它们的内部依赖项,以避免ivy解析。在这种情况下,您不需要在构建中声明
lib1
上的
lib2
的依赖关系,因为
lib2
ProjectRef
将从其自身构建正确解析
lib2
的所有设置和设置,包括它对
lib1
的依赖关系。但是我不能避免将
lib1
放入
lib2
libraryDependencies
中,除非我在
lib2
的构建文件中硬编码到它的相对路径,可以吗?在Maven中,类似的事情非常简单,因为它将首先尝试解决多项目构建模块中的所有依赖关系,然后如果仍然缺少一些依赖关系,它将尝试从外部查找它们。这允许将相同的构建文件重新用于将库发布到repo以及在更大的项目中使用它们,从而完全避免了repo。到目前为止,sbt似乎根本不可能做到这一点。我基本上是在尝试避免在迭代库时必须通过本地常春藤存储库。lib2依赖于lib1,两者都打算在其他项目中使用。当前大项目构建中的一些子项目依赖于lib2,一些依赖于lib1。我尝试将这两个lib作为git子模块添加到主项目中,并在主构建中手动设置它们的内部依赖项,以避免ivy解析。在这种情况下,您不需要在构建中声明
lib1
上的
lib2
的依赖关系,因为
lib2
ProjectRef
将从其自身构建正确解析
lib2
的所有设置和设置,包括它对
lib1
的依赖关系。但是我不能避免将
lib1
放入
lib2
libraryDependencies
中,除非我在
lib2
的构建文件中硬编码到它的相对路径,可以吗?在Maven中,类似的事情非常简单,因为它将首先尝试解决多项目构建模块中的所有依赖关系,然后如果仍然缺少一些依赖关系,它将尝试从外部查找它们。这允许将相同的构建文件重新用于将库发布到repo以及在更大的项目中使用它们,从而完全避免了repo。到目前为止,sbt似乎根本不可能做到这一点。