Scala.js编译目标地

15

我正在进行一个Scala.js跨项目的开发,其中jvm文件夹代表我的服务器应用程序,js代表我的Scala.js代码。

每当我通过sbt crossJS/fastOptJS编译我的Scala.js代码时,编译后的JS会出现在./js/target/scala-2.11/web-fastopt.js中。

我需要让这个编译后的JS文件可在服务器项目的资源中,在jvm文件夹中使用,所以我可以通过我的Web应用程序提供服务。我认为我必须做一些关于artifactPath的操作,但是到目前为止,我无法从我的实验中得到任何结果。

2个回答

8

您可以简单地将fastOptJS任务(或fullOptJS任务)的artifactPath设置为JVM项目的(托管的)资源目录:

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

如果您运行fastOptJS任务,它将被放置在目录中。但是,它不会包含在sbt的resources任务中,并且如果您启动服务器,它不会自动触发。因此:

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

几个注释:

  • 如果你的 Web 服务器只提供特定目录,那么第一步是必要的。否则,第二步就足够了,因为它已经将文件添加到资源中;它所在的位置并不重要。
  • 设置 crossTarget,如 @ochrons 的回答所示,还会输出资源目录中所有的 .class.sjsir 文件。
  • 查看 Vincent Munier 的 sbt-play-scalajs,以获取开箱即用的 sbt-web / Scala.js 集成(它采用稍微不同的方法:从 js 项目中复制文件,而不是直接将其放置在 JVM 项目中。如果您有多个 JVM 项目,则非常有用)。

这似乎没有任何效果。当构建工件时,我的.jsSettings(artifactPath in fullOptJS := file("path/to/file/scala-project.js"))完全被忽略了。 - Ford O.
哈哈!好发现。这应该是artifactPath in fullOptJS in Compile :=。我已经编辑了答案。 - gzm0

5

您可以配置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文件,以防您想在Web应用程序中使用它们。
若要查看更完整的示例,请参阅此教程,其中涉及创建更复杂的Scala.js应用程序的许多其他问题。链接:https://github.com/ochrons/scalajs-spa-tutorial

什么是 sharedProject? - ses
在这个上下文中,sharedProject 指的是一个 Scala.js 跨项目,例如: lazy val shared = (crossProject.crossType(CrossType.Pure) in file("shared")) - ochrons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接