Skip to content
[sbt]あまり複雑なことを考えずに機能を追加する
java-tips-scala-tips
software
2019-10-10

正直まだsbtは理解できていない。まぁ依存性管理ツールはmakeにしろMSbuildにせよ複雑すぎて中をきちんと使いこなすとかできてなかったし。出来合スクリプトで困らんし。

なので専門家からするとまずいのかもしれないが、とりあえず既存のビルドの動きに何かを付け足すくらいの話向け。

  1. ちょこっと作業をまとめたバッチを作りたいだけなのよ→コマンドを使う
    https://www.scala-sbt.org/1.x/docs/ja/Howto-Sequence-using-Commands.html

build.sbt

commands += Command.command("batchtest") { state => "testOnly somepackage.ValidationSpec > list.txt" :: "testOnly somepackage.ExecSpec >> list.txt" :: state } // commandsの使い方はよいがここでリダイレクトは使えないな。。。

2. タスクを作りたいのよ、タスクの前後にラベルを出したいのよ→ 単純なタスク作成
https://qiita.com/mtn81/items/ce482ed16a19f770cc68

3. sbtから外部コマンドを呼びたいのよ→ shell起動
https://www.scala-sbt.org/release/docs/Process.html

lazy val batch = taskKey[Unit]("外部バッチ")
batch in Test := {"powershell.exe ls " !}
lazy val batch = taskKey[Unit]("外部バッチ")
batch in Test := {"powershell.exe ls " !}

4. 依存関係は悩まずにタスクからタスクを呼びたいのよ→ runTask, runInputTask
https://stackoverflow.com/questions/32142055/how-to-call-sbt-inputtask-dynamically

build.sbt

lazy val batch2 = taskKey[Unit]("ドキュメント生成呼び")
batch2 in Test := (doc in Test).value

lazy val batch3 = taskKey[Unit]("テスト1つだけ呼び")
batch3 in Test := (testOnly in Test).toTask(" somepackage.ValidationSpec").value
(↑ toTask(" の部分のスペースが重要)
build.sbt

lazy val batch2 = taskKey[Unit]("ドキュメント生成呼び")
batch2 in Test := (doc in Test).value

lazy val batch3 = taskKey[Unit]("テスト1つだけ呼び")
batch3 in Test := (testOnly in Test).toTask(" somepackage.ValidationSpec").value
(↑ toTask(" の部分のスペースが重要)

5. 依存関係は悩まずにタスクでタスクを連続実行させたいのよ→Def.sequential
https://www.scala-sbt.org/1.x/docs/ja/Howto-Sequential-Task.html

build.sbt

lazy val batch4 = taskKey[Unit]("タスク連続")
batch4 in Test := {
  Def.sequential(
    Def.task {
      "powershell.exe date" !
    } ,
    Def.task {
      (testOnly in Test).toTask(" somepackage.ValidationSpec").value
  ).value
}
build.sbt

lazy val batch4 = taskKey[Unit]("タスク連続")
batch4 in Test := {
  Def.sequential(
    Def.task {
      "powershell.exe date" !
    } ,
    Def.task {
      (testOnly in Test).toTask(" somepackage.ValidationSpec").value
  ).value
}

6. プロジェクトにREPL代わりに書いたAppコードをsbtから呼びたいのよ→_runMain_

Hello.scala

package tools

object Hello extends App {
   println("Hello")
}
Hello.scala

package tools

object Hello extends App {
   println("Hello")
}
build.sbt

lazy val batch5 = taskKey[Unit]("内部ツール呼び出し")
batch5 in Test := (runMain in Test).toTask(" tools.Hello").value
(↑ toTask(" の部分のスペースが重要)
build.sbt

lazy val batch5 = taskKey[Unit]("内部ツール呼び出し")
batch5 in Test := (runMain in Test).toTask(" tools.Hello").value
(↑ toTask(" の部分のスペースが重要)