【问题标题】:SBT classpath dependency with ScalaJS crosscompile projectSBT 类路径依赖与 ScalaJS 交叉编译项目
【发布时间】:2017-04-17 11:29:02
【问题描述】:

我有 2 个不同的独立项目 A 和 B,它们都使用 ScalaJS 默认的连接交叉编译项目的方式(见这里:https://www.scala-js.org/doc/project/cross-build.html)。

现在我想添加一个从 B 到 A 的 SBT 类路径依赖项,方式类似于:

projectA.dependsOn(projectB)

项目B的js部分可以使用项目A的jsshared部分,jvm部分可以访问项目A的jvmshared部分。

由于我使用upickle 序列化我的数据,我不能只使用libraryDependeny 和项目A 的publishLocal(因为upickle 在我的情况下需要有关项目A 的编译时间信息)。

我该如何解决这个问题?

【问题讨论】:

  • CrossProject 之间的默认 .dependsOn 应该会给您提供这种行为。
  • 我可以从uri 构建一个CrossProject(就像一个普通的根项目),这样我就可以从远程git repo 中提取它吗? CrossProject 的文档非常少,我还没有找到任何工厂方法/构造函数。
  • CrossProject 是一个工厂,用于在您的build.sbt 中创建两个 sbt 项目,一个用于 JVM,一个用于 JavaScript,同时共享一些设置和其他定义。此时没有从远程存储库中提取。你能澄清一下你想要做什么吗?
  • 项目 A 和项目 B 不共享目录结构,这意味着它们在磁盘上是独立的(或在不同的远程 git 存储库上)。问题归结为如何从FileUri 创建CrossProject,就像RootProject 可以从这两种引用中构建一样。

标签: scala sbt cross-compiling scala.js


【解决方案1】:

对于同一构建中的CrossProject,您可以简单地使用.dependsOn

lazy val a = crossProject
lazy val b = crossProject.dependsOn(a)

// snip aJS, aJVM, bJS, bJVM

目前,无法从 URI/文件中导入 CrossProject,例如 RootProject。然而,一个CrossProject 只不过是两个普通的 sbt 项目。您可以单独导入这些:

// a.sbt

lazy val a = crossProject
lazy val aJS = a.js
lazy val aJVM = a.jvm

// b.sbt

lazy val b = crossProject.
  configureJS(_.dependsOn(aJS)).
  configureJVM(_.dependsOn(aJVM))

lazy val aJS = ProjectRef(file("projectA"), "aJS")
lazy val aJVM = ProjectRef(file("projectA"), "aJVM")

请注意,我们似乎没有理由无法创建一个 CrossProjectRef 来将其从您那里抽象出来。因此,如果您经常需要此功能,请随时 open an issue 以便我们更详细地了解它。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 2011-12-17
    • 2020-04-11
    • 2011-12-16
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多