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