使用scala-js crossCompile时如何为子项目启用插件()?

How to enablePlugins() for subprojects when using scala-js crossCompile?

请注意,这不是 IntelliJ 错误,当在项目中启动 sbt 时直接从 SBT 运行 出现:

C:\Users\brand\Documents\GitHub\scalajs-cross-compile-example\build.sbt:27: error: type mismatch;
 found   : sbt.Project
 required: sbt.internals.DslEntry
fooJVM.enablePlugins(SbtXjcPlugin)

我正在使用 scala-js 交叉编译项目的规范示例,其中更改了两行 (on github)。

如您所见,唯一的区别是我在 plugins.sbt 中添加了另一个插件:

addSbtPlugin("org.scala-sbt.plugins" % "sbt-xjc" % "0.8")

并且我将这一行添加到 buid.sbt 的末尾:

fooJVM.enablePlugins(SbtXjcPlugin)

不可否认,这是一个人为的例子,但我确实有理由只想为 JVM 项目启用插件,如有必要,我可以详细介绍。

您不得在 fooJVM 上调用任何内容(文档中的 pitfalls 部分对此进行了解释)。

而是使用 jvmConfigure:

lazy val foo = crossProject.in(file(".")).
   // stuff
   jvmConfigure(_.enablePlugins(SbtXjcPlugin))

您需要这样做的原因是 enablePlugins returns 修改了 Project 的新实例。所以 foo.jvmfooJVM 不再是同一个项目。

但是,您可能会注意到,这不是构建文件失败的原因:在您的特定情况下,构建失败是因为 sbt 不允许这样的 "bare" 语句。这是有道理的,因为他们出于同样的原因没有做任何事情:enablePlugins returns 启用插件但不改变接收器的新 Project