Scala.js компиляция адресата

Я работаю над кросс-проектом Scala.js, где папка jvm представляет мое серверное приложение, а js представляет мой код Scala.js.

Всякий раз, когда я компилирую свой Scala.js код через sbt crossJS/fastOptJS, скомпилированный JS заканчивается в ./js/target/scala-2.11/web-fastopt.js.

Мне нужно, чтобы этот скомпилированный JS файл был доступен в ресурсах проекта сервера в папке jvm, поэтому я могу выполнить его через мое веб-приложение. Я думаю, что мне нужно что-то сделать с помощью artifactPath, но я пока не могу получить никаких результатов от моих экспериментов.

Ответ 1

Вы можете просто установить artifactPath задачи fastOptJS (или задачи fullOptJS) в каталог ресурсов (управляемых) вашего проекта JVM:

// In the JS project settings
artifactPath in fastOptJS :=
  (resourceManaged in jvm in Compile).value /
    ((moduleName in fastOptJS).value + "-fastopt.js"))

Это поместит его в каталог, если вы запустите задачу fastOptJS. Однако он не будет включен в задачу sbt resources, и он не будет автоматически запущен, если вы запустите свой сервер. Поэтому:

// In the JVM project settings
resources in Compile += (fastOptJS in js).value.data

Несколько примечаний:

  • Первый шаг необходим только в том случае, если ваш веб-сервер обслуживает только определенные каталоги. В противном случае второго достаточно, так как это добавляет файл к ресурсам уже; где он лежит, является вторичным.
  • Установка crossTarget, как и в ответе @ochrons, также выведет все файлы .class и .sjsir в каталог ресурсов.
  • Посмотрите на Vincent Munier sbt-play-scalajs для интеграции sbt-web/Scala.js из коробки. это несколько иной подход: он копирует файл из проекта js, а не напрямую помещает его в проект JVM. Полезно, если у вас несколько проектов JVM).

Ответ 2

Вы можете настроить плагин Scala.js SBT для вывода файла JavaScript в папку по вашему выбору. Например, например:

// configure a specific directory for scalajs output
val scalajsOutputDir = Def.settingKey[File]("directory for javascript files output by scalajs")

// make all JS builds use the output dir defined later
lazy val js2jvmSettings = Seq(fastOptJS, fullOptJS, packageJSDependencies) map { packageJSKey =>
  crossTarget in(js, Compile, packageJSKey) := scalajsOutputDir.value
}
// instantiate the JVM project for SBT with some additional settings
lazy val jvm: Project = sharedProject.jvm.settings(js2jvmSettings: _*).settings(
  // scala.js output is directed under "web/js" dir in the jvm project
  scalajsOutputDir := (classDirectory in Compile).value / "web" / "js",

Это также сохранит файлы -jsdeps.js и .js.map в той же папке, если вы хотите использовать их в своем веб-приложении.

Для более полного примера ознакомьтесь с этим руководством, в котором рассматриваются многие другие проблемы создания более сложного приложения Scala.js.

Ответ 3

Или просто:

artifactPath in (Compile, fastOptJS) := (artifactPath in (Compile, fullOptJS)).value

Сравните с решением gzm0, вы не re