1. スクリプトモード

スクリプトモード 

sbtには、次の目的で使用できる代替のエントリーポイントがあります。

  • 依存関係宣言またはその他のsbt設定を含むScalaスクリプトをコンパイルして実行する

このエントリーポイントは実験的とみなされるべきです。これらのアプローチの注目すべき欠点は、起動時間に関わることです。

sbtスクリプトランナー 

スクリプトランナーは標準のScalaスクリプトを実行できますが、sbtを構成する機能が追加されています。 sbt設定は、/***で始まるコメントブロックにスクリプトに埋め込むことができます。

 

次のスクリプトをコピーして実行可能にしてください。スクリプト名とオペレーティングシステムに応じて、最初の行を調整する必要がある場合があります。実行すると、この例ではScala、必要な依存関係を取得し、スクリプトをコンパイルして直接実行する必要があります。たとえば、script.scalaという名前を付けた場合は、Unixで次のようにします。

chmod u+x script.scala
./script.scala
#!/usr/bin/env sbt -Dsbt.version=1.6.1 -Dsbt.main.class=sbt.ScriptMain -error

/***
ThisBuild / scalaVersion := "2.13.12"
libraryDependencies += "org.scala-sbt" %% "io" % "1.6.0"
*/

println("hello")

これはhelloと出力します。 sbtからIOを使用することに慣れている場合は、テキストファイルの読み取りなどの基本的なファイル操作を行うことができます。

#!/usr/bin/env sbt -Dsbt.version=1.6.1 -Dsbt.main.class=sbt.ScriptMain -error

/***
ThisBuild / scalaVersion := "2.13.12"
libraryDependencies += "org.scala-sbt" %% "io" % "1.6.0"
*/

import sbt.io.IO
import sbt.io.Path._
import sbt.io.syntax._
import java.io.File
import java.net.URI
import sys.process._

def file(s: String): File = new File(s)
def uri(s: String): URI = new URI(s)

def processFile(f: File): Unit = {
  val lines = IO.readLines(f)
  lines foreach { line =>
    println(line.toUpperCase)
  }
}

args.toList match {
  case Nil => sys.error("usage: ./script.scala <file>...")
  case xs  => xs foreach { x => processFile(file(x)) }
}

このスクリプトは、ファイル名を引数として受け取り、すべて大文字で出力します。

$ ./script.scala script.scala
#!/USR/BIN/ENV SBT -DSBT.MAIN.CLASS=SBT.SCRIPTMAIN -ERROR
....