如何在使用scala-js交叉编译时为子项目启用plugins()



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

C:UsersbrandDocumentsGitHubscalajs-cross-compile-examplebuild.sbt:27: error: type mismatch;
 found   : sbt.Project
 required: sbt.internals.DslEntry
fooJVM.enablePlugins(SbtXjcPlugin)

我使用的是scala-js交叉编译项目的典型示例,其中有两行更改(在github上)。

你可以检查,唯一的区别是我添加了另一个插件到plugins.sbt:

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

我在buid.sbt的末尾添加了这一行:

fooJVM.enablePlugins(SbtXjcPlugin)

无可否认,这是一个有点人为的例子,但我确实有理由希望仅为JVM项目启用插件,如果有必要,我可以更详细地说明。

不能在fooJVM上调用任何东西(文档中的陷阱部分解释了这一点)。

请使用jvmConfigure:

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

您需要这样做的原因是enablePlugins返回一个修改过的Project的新实例。因此,foo.jvmfooJVM不再是同一个项目了。

然而,您可能会注意到,这并不是构建文件失败的原因:在您的特定情况下,构建失败是因为sbt不允许这样的"裸"语句。这是有道理的,因为它们不做任何事情的原因相同:enablePlugins返回一个新的Project与插件启用,但不改变接收器。

最新更新