如何将scala.js中的JavaScripts输出路径添加到Play?

时间:2014-09-23 08:41:38

标签: playframework sbt scala.js

我正在尝试播放(完全是sbt-web)来访问从scala.js创建的javascript文件。

使用unmanagedResourceDirectories in Assets +=我可以为sbt-web设置一个自动复制到正确资产目录的窗口。问题是我不会硬编码javascript文件的路径。

我的Build.scala看起来像这样:

import play.Play._
import com.typesafe.sbt.web.Import.Assets
import scala.scalajs.sbtplugin.ScalaJSPlugin._
import scala.scalajs.sbtplugin.ScalaJSPlugin.ScalaJSKeys._

object Build extends sbt.Build {
    override def rootProject = Some(jvm) 

    lazy val js = project
                    .settings(scalaJSSettings: _*)
                    .settings(
                       scalaVersion := "2.11.2"
                    )

    lazy val jvm = project
                     .settings(play.PlayScala)
                     .settins(
                       scalaVersion := "2.11.2",
                       // This is the interesting line
                       unmanagedResourceDirectories in Assets += (target in js).value / "scala-2.11",
                       compile in Compile <<= (compile in Compile) dependsOn (fastOptJS in (js, Compile))
                     )
                     .aggregate(js)
}

有没有办法从scala.js获取javascript的输出路径?

(target in js).value / "scala-2.11"有效,但资产输出中有硬编码的scala-2.11classes目录。

另一个问题是文件现在位于web/public/main/而不是web/public/main/js

3 个答案:

答案 0 :(得分:3)

您可以使用(target in js).value / "scala-2.11"而不是(crossTarget in js).value。它将附加正确的子目录,具体取决于您的Scala版本。

fastOptJS in (js, Compile)生成的文件的完全限定名称为artifactPath in (js, Compile, fastOptJS),这在sbt中是惯常的。

您也可以修改fastOptJS来更改artifactPath的目标文件。这可以帮助您解决上一个问题。此技术可用于将生成的文件直接发送到jvm项目的托管资源。

答案 1 :(得分:2)

我一直在努力解决这个问题近3天。其中大部分是关于如何将js输出集成到播放自动重新加载中。我的建议是什么:

1.添加目标路径来播放资产不太合适。因为,好吧,只是不整洁和玩游戏的指纹控制。等

2.Copy file to assets文件夹。擅长开头。但是,当我添加triggeredBy或dependsOn时,尝试让播放自动重新加载并执行复制。发生了问题:无论我如何从wathSources中排除资产,都会多次调用复制,无论服务器是什么。

3.更改js输出路径。我最终回到了这个方法。有些人提到改变 artifactPath 的价值,然而,我无法解决这个问题。

我在下面做了什么:

//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 jsOutputSettings = Seq(fastOptJS, fullOptJS, packageJSDependencies, packageScalaJSLauncher, packageMinifiedJSDependencies) map { packageJSKey =>
  crossTarget in(Compile, packageJSKey) := scalajsOutputDir.value
}

我使用sbt的检查来查找 packageMinifiedJSDependencies

希望我能帮助后来遇到此事的人。

答案 2 :(得分:0)

看看sbt-play-scalajs。它是一个额外的sbt插件,可以帮助与Play / sbt-web集成。

您的构建文件将如下所示(从README复制):

import sbt.Project.projectToRef

lazy val jsProjects = Seq(js)

lazy val jvm = project.settings(
  scalaJSProjects := jsProjects,
  pipelineStages := Seq(scalaJSProd)).
  enablePlugins(PlayScala).
  aggregate(jsProjects.map(projectToRef): _*)

lazy val js = project.enablePlugins(ScalaJSPlugin, ScalaJSPlay)