我正在尝试使用
scalajs将一些
scala源代码编译为
javascript而不修改有关sbt环境的任何其他内容,我不希望它覆盖“run”sbt命令的默认行为.
目前我有一个build.sbt,看起来像:
import ScalaJSKeys._ scalaJSSettings name := "foo" organization := "com.example" scalaVersion := "2.11.4" compile <<= (compile in Compile) dependsOn (fastOptJS in Compile) crossTarget in (fastOptJS in Compile) := ((classDirectory in Compile).value / "public" / "js") libraryDependencies ++= { val sprayVersion = "1.3.2" val akkaVersion = "2.3.7" Seq( "io.spray" %% "spray-can" % sprayVersion,"io.spray" %% "spray-routing" % sprayVersion,"io.spray" %% "spray-servlet" % sprayVersion,"io.spray" %% "spray-testkit" % sprayVersion % "test","com.typesafe.akka" %% "akka-actor" % akkaVersion,"com.typesafe.akka" %% "akka-testkit" % akkaVersion % "test","org.specs2" %% "specs2-core" % "2.3.11" % "test","javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided","org.scala-lang.modules.scalajs" %%% "scalajs-jquery" % "0.6" )}
哪个编译javascript和scala就好了,但问题是这实际上打破了现有的“run”命令,我希望使用与默认sbt相同的发现来运行普通的旧scala.我的项目很简单,所以我不想沿着多项目路线走下去(就像play-with-scalajs-example).我想我可能需要删除scalaJSSettings,但后来我不知道如何访问fastOptJS目标,所以我可以将它作为依赖项附加到编译后执行此操作.
解决方法
你不能这样做.只要将scalaJSSettings放在项目中,所有源代码都将使用Scala.js编译器插件进行编译.
这确实会生成.class文件,但是,它们包含基本Scala编译器不会发出的内容,因此可能导致二进制不兼容问题或意外行为(请参阅this post).
相反,使用多项目构建:
import ScalaJSKeys._ organization := "com.example" scalaVersion := "2.11.4" val sprayVersion = "1.3.2" val akkaVersion = "2.3.7" lazy val foo = project. settings( name := "foo",compile <<= (compile in Compile) dependsOn (fastOptJS in Compile in bar),crossTarget in (fastOptJS in Compile in bar) := ((classDirectory in Compile).value / "public" / "js"),libraryDependencies ++= Seq( "io.spray" %% "spray-can" % sprayVersion,"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided" ) ) lazy val bar = project. settings(scalaJSSettings: _*). settings( name := "bar",libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-jquery" % "0.6",)
这显然也解决了run命令的问题.