1. Script 模式

Script 模式 

sbt 有替代的進入點可用於

  • 編譯和執行包含相依性宣告或其他 sbt 設定的 Scala 腳本

這個進入點應被視為實驗性的。這些方法的一個顯著缺點是啟動時間。

sbt Script 執行器 

腳本執行器可以執行標準的 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
....