投稿の内容
本投稿では、Scala.js
のsbt
のタスクfastLinkJS
で出力されたJSファイルを任意の場所にコピーするするようにfastLinkJS
を修正します。
fastLinkJS
タスクとは
fastLinkJS
タスクは、sbt
のScala.js
のビルドタスクです。
以下のように使います。
sbt> fastLinkJS
このタスクを実行すると以下のディレクトリにmain.js
を出力します。
target/scala-{scalaVersion}/{projectName}-fastopt/main.js
main.js
をHTML
で使う
このmain.js
をHTML
ファイルで以下のように使用します。
<script type="text/javascript" src="./target/scala-{scalaVersion}/{projectName}-fastopt/main.js"></script>
main.js
の出力先を修正する
main.js
のデフォルトの出力先だと、HTML
ファイルがある場所からは使い辛いですよね?例えば、デプロイしたいディレクトリがdist
ディレクトリだとするとHTML
ファイルもdist/index.html
にあるわけで、main.js
もdist/main.js
に出力したいところです。
そこでfastLinkJS
タスクを修正して、例えばdist/main.js
に出力させるように修正したいと思います。
fastLinkJS
を上書きする
まずbuild.sbt
でfastLinkJS
を修正するにはsettings
の中でfastLinkJS
を上書きします。
lazy val myProject = (project in file("./my-project"))
.enablePlugins(ScalaJSPlugin)
.settings(
...
fastLinkJS := {
// ここに修正を書く
}
...
)
デフォルトの出力先を取得する
// デフォルトの出力先ディレクトリを取得
val oldOutputDir = (ThisProject / Compile / fastLinkJSOutput).value
// デフォルトのfastLinkJSの結果を取得する
val report = (ThisProject / Compile / fastLinkJS).value
// 出力ファイル名を取得する(main.js)
val jsFileName = report.data.publicModules.head.jsFileName
// デフォルトの出力先パス
val oldOutputPath = java.nio.file.Path.of(oldOutputDir.toString, jsFileName).toFile
新しい出力先を設定する
// 新しい出力先ディレクトリ
val newOutputDir = s"./dist"
// 新しい出力先パス
val newOutputPath = java.nio.file.Path.of(newOutputDir, jsFileName).toFile
// 新しい出力先にコピーする
IO.copyFile(oldOutputPath, newOutputPath)
ソースマップも出力する
// ソースマップファイル名の取得(Option[String])
val sourceMapName = report.data.publicModules.head.sourceMapName
sourceMapName.foreach { fname =>
// デフォルトのソースマップファイルの出力先
val oldSourceMapPath = java.nio.file.Path.of(oldOutputDir.toString, fname).toFile
// 新しいソースマップファイルの出力先
val newSourceMapPath = java.nio.file.Path.of(newOutputDir, fname).toFile
// 新しい出力先にソースマップをコピーする
IO.copyFile(oldSourceMapPath, newSourceMapPath)
}
まとめ
lazy val myProject = (project in file("./my-project"))
.enablePlugins(ScalaJSPlugin)
.settings(
...
fastLinkJS := {
val oldOutputDir = (ThisProject / Compile / fastLinkJSOutput).value
val report = (ThisProject / Compile / fastLinkJS).value
val jsFileName = report.data.publicModules.head.jsFileName
val oldOutputPath = java.nio.file.Path.of(oldOutputDir.toString, jsFileName).toFile
val newOutputDir = s"./dist"
val newOutputPath = java.nio.file.Path.of(newOutputDir, jsFileName).toFile
IO.copyFile(oldOutputPath, newOutputPath)
val sourceMapName = report.data.publicModules.head.sourceMapName
sourceMapName.foreach { fname =>
val oldSourceMapPath = java.nio.file.Path.of(oldOutputDir.toString, fname).toFile
val newSourceMapPath = java.nio.file.Path.of(newOutputDir, fname).toFile
IO.copyFile(oldSourceMapPath, newSourceMapPath)
}
report
}
...
)