【问题标题】:How to add the output path of JavaScripts from scala.js to Play?如何将 JavaScript 的输出路径从 scala.js 添加到 Play?
【发布时间】:2014-11-17 09:28:13
【问题描述】:

我正在尝试玩(确切地说是 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下。

【问题讨论】:

标签: playframework sbt scala.js


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我喜欢设置artifactPaht 的解决方案。有没有办法设置启动器的路径? (ScalaJSKeys.persistLauncher := true)
  • 可以,可以设置artifactPath in (Compile, packageScalaJSLauncher)
【解决方案2】:

我已经研究了将近 3 天的解决方案。其中大部分是关于如何将 js 输出集成到游戏自动重新加载中。我的建议:

1.添加播放资源的目标路径不是很合适。因为,好吧,只是不整洁并且用于游戏的指纹控制。等等

2.将文件复制到资产文件夹。一开始还不错。但是,当我添加triggerBy或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

希望我能帮助以后遇到这个问题的人。

【讨论】:

  • artifactPath 对我也不起作用。它不会影响 -jsdeps.js 文件。此外,我在执行清理任务时如何清理 scalajsOutputDir?
【解决方案3】:

看看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)

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多