sbt_ABC
intro
sbt是scala官方的構建工具,是simple build tool的縮寫,但是一直被稱為stupid build tool,因為太過靈活複雜。之所以複雜,是因為sbt定義了太多的隱式轉換。今天講一點入門。
預設匯入
sbt是用scala定義的dsl語言,所謂的dsl其實只是精簡了scala的語法得到的一種新的程式語言。一個buid.sbt其實就是一個Project的物件。可以將build.sbt 理解為一個scala worksheet,build.sbt預設匯入了大量物件:
import sbt._ //大量物件 import sbt.Keys._
先看Keys物件,裡面包含了大量鍵值對物件。這裡選3個常見的:
package sbt //a lot import here object Keys { val libraryDependencies = settingKey[Seq[ModuleID]](...) val organization = settingKey[String]("Organization/group ID.").withRank(APlusSetting) val version = settingKey[String]("The version/revision of the current module.").withRank(APlusSetting) }
在sbt語言中, 有3種鍵值對型別:
There are three flavors of key: SettingKey[T]: a key for a value computed once (the value is computed when loading the subproject, and kept around). TaskKey[T]: a key for a value, called a task, that has to be recomputed each time, potentially with side effects. InputKey[T]: a key for a task that has command line arguments as input. Check out Input Tasks for more details.
定義鍵值對有3種語法:
// bare style. version in ThisBuild := "1.0-SNAPSHOT" //bare style. ThisBuild / version := "0.1.0-SNAPSHOT" //在.settings()方法內修改 lazy val `hello-api` = (project in file("hello-api")) .settings( libraryDependencies ++= Seq( lagomScaladslApi ) )
其中,version,libraryDependencies是sbt.Keys的一個屬性, in是定義在SettingKey的父類ScopingSetting中的方法。 這塊邏輯有點繞的。
:=
自然是方法,在 SettingKey
裡面定義。
第二種方法的 /
是一個RichReference的自定義操作符。這裡自然涉及隱式轉換,是在trait SlashSyntax定義的, 在Project中extends SlashSyntax匯入。不瞭解的請參考之前的教程。簡單地舉例:
//通過extends trait匯入implicit和SlashSyntax._ object Test extends SlashSyntax { def main(args: Array[String]): Unit = { val s:Int = 10 \ 2 println(s) // 102 } } trait SlashSyntax { //匯入IntOps import SlashSyntax._ implicit def intOps(src: Int) = new IntOps(src) } object SlashSyntax { final class IntOps(private val intSrc: Int) { def \(a2: Int): Int = (intSrc.toString + a2.toString).toInt } }
package object
在寫java spring程式碼時,每個controller都要匯入不少相同的類,通過package object可以消除這部分程式碼。此外,可以在package object定義常用的隱式轉換方法,有效減少冗餘的檢查程式碼。 具體參考:scala package object 通過package object sbt給build.sbt增強了大量物件和語法,例如上面的 SlashSyntax
。
package object sbt extends sbt.IOSyntax0 with sbt.std.TaskExtra with sbt.internal.util.Types with sbt.ProjectExtra with sbt.librarymanagement.DependencyBuilders with sbt.librarymanagement.DependencyFilterExtra with sbt.librarymanagement.LibraryManagementSyntax with sbt.BuildExtra with sbt.TaskMacroExtra with sbt.ScopeFilter.Make with sbt.BuildSyntax with sbt.OptionSyntax with sbt.SlashSyntax with sbt.Import {
project
lazy val root = (project in file(".")) .settings( name := "Hello", libraryDependencies += derby )
lazy val root = (project in file("."))
得到一個Project物件。
taskKey
待續