SBT`CrossProject`构建打破了自定义编译目标

时间:2015-10-17 08:57:30

标签: scala sbt scala.js

使用为基于Scala.js /tmp/sbt/的构建定义的自定义编译目标(CrossProject上的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)

尝试按照建议CrossTypein the docs进行子类化,覆盖projectDirsharedSrcDir无效,同样的错误。这是SBT source location,其中检查重叠目标。

我想知道为什么这会出现在自定义编译目标中,而不是默认目标?更重要的是,如何使用Scala.js'crossProject获得自定义编译目标?

1 个答案:

答案 0 :(得分:2)

从评论中,您可以像这样自定义目标目录:

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

,以0.13表示法,表示:

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

这将导致跨项目出现问题,因为默认情况下crossProject的JVM和JS变体都具有相同的name,因此两个项目最终都会使用相同的目标目录,这会导致你的冲突。

你有两种可能来解决这个问题。要么更改name设置以使它们不相同(但是您需要重新自定义normalizedName以便它们再次相同),或者更改计算方式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 ""))
}

由于黑客攻击不是很优雅,但至少在全局配置中只需要它一次。