【问题标题】:SBT `CrossProject` build broken with custom compile targetSBT `CrossProject` 构建被自定义编译目标破坏
【发布时间】:2015-10-17 19:00:33
【问题描述】:

为基于 Scala.js CrossProject 的构建定义的自定义编译目标(/tmp/sbt/ 上的 ramdisk)出现“重叠输出目录”sbt 错误。

FWIW,已在 SBT 项目中无缝使用上述编译目标 3 年。使用 sbt 默认编译目标(即构建项目根目录)时不会发生错误。因为我的工具是围绕 ramdisk 设置而设计的,所以有点碍事。

这是实际的错误:

Overlapping output directories:/tmp/sbt/foo:
[error]     ProjectRef(file:/home/me/path/to/project/,fooJS)
[error]     ProjectRef(file:/home/me/path/to/project/,fooJVM)

已尝试按照建议的in the docs 子类化CrossType,覆盖projectDirsharedSrcDir 无济于事,同样的错误。这是检查重叠目标的SBT source location

我想知道为什么自定义编译目标会发生这种情况,而不是默认目标?更重要的是,如何使用 Scala.js 的 crossProject 获得自定义编译目标?

【问题讨论】:

  • 您用来定义自定义编译目标的 sbt 配置是什么?
  • @sjrd 我分叉了你的 scalajs-cross-compile github 项目。这是构建的要点:gist.github.com/godenji/a161be68fabc988fb5fa
  • 尝试了各种方法,例如从 file(".") 更改为 file("module"),以及将 projectDirsharedSrcDir 拆分为单独的目录,无论如何都会出现相同的错误。
  • @sjrd 哦,编译目标是在我的~/.sbt/0.13/global.sbt中全局定义的,包括:target <<= (name) {(name) => file("/tmp/sbt/") / name }

标签: scala sbt scala.js


【解决方案1】:

在 cmets 中,您可以像这样自定义目标目录:

target <<= (name) { (name) => file("/tmp/sbt") / name }

在 0.13 表示法中,这意味着:

target := file("/tmp/sbt") / name.value

这会导致跨项目出现问题,因为默认情况下crossProject 的 JVM 和 JS 变体都具有相同的name,因此两个项目确实会以相同的目标目录结束,这会导致您的冲突.

您有两种方法可以解决此问题。要么更改 name 设置以使其不相同(但随后您需要重新自定义 normalizedNames 以使它们再次相同),或者更改计算 target 的方式所以会有所不同。

第一个解决方案:

lazy val foo = crossProject.in(...).
  jvmSettings(name := name.value + "-jvm").
  jsSettings(name := name.value + "-js").
  settings(
    normalizedName := normalizedName.value.stripSuffix("-jvm").stripSuffix("-js")
  ).
  // other settings

这不是很优雅。我建议另一种方法,例如:

target := {
  /* Hacky way to detect whether this is a Scala.js project
   * without pulling the Scala.js sbt plugin on the classpath.
   */
  val isScalaJS = libraryDependencies.value.exists { dep =>
    dep.name.startsWith("scalajs-library") // not tested
  }
  file("/tmp/sbt") / (name.value + (if (isScalaJS) "-js" else ""))
}

由于 hack 也不是很优雅,但至少您在全局配置中只需要一次。

【讨论】:

  • Hack 非常受欢迎——无法在 jvm 和 js 项目之间共享代码阻止了我全神贯注于 Scala.js(即完全放弃现有的无类型 Coffeescript 代码库)。问题解决了,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多