I'm working on a Scala.js cross project where the jvm
folder represents my server application and js
represents my scala.js code.
Whenever i compile my scala.js code via sbt crossJS/fastOptJS
the compiled JS ends up in ./js/target/scala-2.11/web-fastopt.js
.
I need to have this compiled JS file accessible in the resources of the server project in the jvm
folder, so i can server it through my web application. I think i have to do something with artifactPath
but i can't seem to get any results from my experiments thus far.
You can simply set the artifactPath
of the fastOptJS
task (or the fullOptJS
task) to the (managed) resources directory of your JVM project:
// In the JS project's settings
artifactPath in fastOptJS in Compile :=
(resourceManaged in jvm in Compile).value /
((moduleName in fastOptJS).value + "-fastopt.js"))
This will put it in the directory, if the you run the fastOptJS task. However, it will not be included in sbt's resources
task and it will not automatically be triggered, if you launch your server. Therefore:
// In the JVM project's settings
resources in Compile += (fastOptJS in js).value.data
A couple of notes:
crossTarget
, as in @ochrons' answer will also output all the .class
and .sjsir
files in the resource directory.js
project, rather than directly placing it in the JVM project. Useful if you have multiple JVM projects).You can configure the Scala.js SBT plugin to output the JavaScript file in folder of your choosing. For example like this:
// 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",
This will also store -jsdeps.js and .js.map files in the same folder, in case you want to use those in your web app.
For a more complete example, check out this tutorial which addresses many other issues of creating a more complex Scala.js application.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With