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
....