As you may know, Scala.js 1.0.0
just went final.
For end-products, the upgrade is rather simple, just bump the plugin version and fix potential compile issues. If
you’re maintaining a library, cross-building for 0.6.x
and 1.0.x
is still a bit tricky, but possible…
How to parametrize the plugin version?
First of all, one needs to find a way to locad different versions of the SBT plugin. This is possible using the
following snippet:
project/plugins.sbt
val scalaJSVersion = Option(System.getenv("SCALAJS_VERSION")).getOrElse("1.0.1")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % scalaJSVersion)
That’s basically it. Now one can release for different Scala.js versions using shell commands like the following:
SCALAJS_VERSION=0.6.32 sbt +publish
SCALAJS_VERSION=1.0.1 sbt +publish
sbt +publish # picks default version
As usual, the above will publish for all crossScalaVersions
, but keep in mind, that Scala.js 1.0.x
only supports
Scala >= 2.12
.
Enabling the JSDom
Scala.js 1.0.x
has externalized the JSDom support to its own package, which in turn is not compatible with sjs
0.6.x
. One approach to solve this, is adding the following to your project/plugins.sbt
:
libraryDependencies ++= {
if(scalaJSVersion.startsWith("1.")) {
Seq("org.scala-js" %% "scalajs-env-jsdom-nodejs" % "1.0.0" )
} else {
Nil
}
}
Now, the JSDom from Node.js can be used with both versions:
build.sbt
jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv
Version-based dependencies
There are some libs, which are completely different between the versions. One example is scalajs-tools
which was
splitted into different ones (e.g. scalajs-logging
) for 1.0.x
. The following SBT code snippet enables version-based
dependencies:
build.sbt
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-dom" % "1.0.0",
"co.fs2" %%% "fs2-core" % "2.3.0"
) ++ {
if(scalaJSVersion.startsWith("1.")) Seq(
"org.scala-js" %%% "scalajs-logging" % scalaJSVersion
) else Seq(
"org.scala-js" %%% "scalajs-tools" % scalaJSVersion
)
}