如何使用 resourceGenerators 复制 Scala.js 源地图?

How can I copy Scala.js source maps using resourceGenerators?

我在使用 products 时使用 resourceGenerators sbt 密钥复制 fastOptJs 生成的 .js 文件,如下所示:

(resourceGenerators in Compile) <+=
        (fastOptJS in Compile in frontend, packageScalaJSLauncher in Compile in frontend, packageJSDependencies in Compile in frontend)
          .map((f1, f2, f3) => {
            Seq(f1.data, f2.data, f3)
          })

运行 sbt中的以下内容,我可以看到生成文件的路径:

> show frontend/fastOptJS
[info] Attributed(/some/path/frontend/target/scala-2.11/frontend-fastopt.js)
[success] Total time: 0 s, completed Mar 12, 2016 1:59:22 PM

同样,我可以很容易地看到 Scala.js 生成的启动器在哪里结束:

> show frontend/packageScalaJSLauncher
[info] Attributed(/some/path/frontend/target/scala-2.11/frontend-launcher.js)
[success] Total time: 0 s, completed Mar 12, 2016 2:00:10 PM

但是,我无法找到可以指向 .js.map 文件位置的 task/key。我试着查看插件源,但找不到。有什么方法可以做到这一点而无需在 build.sbt 中创建手动映射?

Scala.js 生成的源映射始终具有相应 .js 文件的名称 + ".map"。所以你可以用 f1.getParentFile / (f1.getName + ".map").

找到与 f1 关联的那个

顺便说一句,新版本不应该使用 <+=。比较好理解的应该用+=代替:

resourceGenerators in Compile += Def.task {
  val f1 = (fastOptJS in Compile in frontend).value.data
  val f1SourceMap = f1.getParentFile / (f1.getName + ".map")
  val f2 = (packageScalaJSLauncher in Compile in frontend).value.data
  val f3 = (packageJSDependencies in Compile in frontend).value
  Seq(f1, f1SourceMap, f2, f3)
}

为了避免到处都是in Compile,你可以使用inConfig(Compile):

inConfig(Compile)(Seq(
  resourceGenerators += Def.task {
    val f1 = (fastOptJS in frontend).value.data
    val f1SourceMap = f1.getParentFile / (f1.getName + ".map")
    val f2 = (packageScalaJSLauncher in frontend).value.data
    val f3 = (packageJSDependencies in frontend).value
    Seq(f1, f1SourceMap, f2, f3)
  }
))