Как включить plugins() для подпроектов при использовании перекрестной компиляции scala-js?

#sbt #scala.js

#sbt #scala.js

Вопрос:

Обратите внимание, что это не ошибка 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, которые я могу рассмотреть более подробно, если необходимо.

Ответ №1:

Вы не должны ничего вызывать fooJVM (это объясняется в разделе «Подводные камни» в документации).

Вместо этого используйте jvmConfigure :

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

Причина, по которой вам нужно это сделать, заключается в том, что enablePlugins возвращает новый экземпляр Project , который был изменен. So foo.jvm и fooJVM больше не являются одним и тем же проектом.

Однако, как вы, вероятно, заметили, сбой вашего файла сборки происходит не из-за этого: в вашем конкретном случае сборка завершается неудачно, потому что sbt не допускает «голых» операторов, подобных этому. Это имеет смысл, поскольку они ничего не делают по той же причине: enablePlugins возвращает новый Project с включенным плагином, но не изменяет получателя.

Комментарии:

1. Спасибо! Я думаю, что это должно быть jvmConfigure и нет configureJvm , но тот факт, что вы ввели это из памяти, еще более впечатляет новичка SBT даже с опечаткой!

2. Хахахахахахаха, так и должно быть jvmConfigure … Вы знаете, особенность заключается в следующем: (1) У меня была открыта документация (2) Я написал этот код.