這裏只討論.sbt。 web
name := "hello"這個Setting[String]將映射中的name鍵與"hello"關聯(添加或替換)。將轉換後的映射做爲新的sbt映射。
總結:構建定義定義了一個Setting[T]列表,Setting[T]是會影響sbt映射鍵值對的轉換,T是值得類型。 apache
name := "hello" version := "1.0" scalaVersion := "2.9.2"
build.sbt中的表達式都是相互獨立的,並且他們是表達式而不是完整的scala語句。在build.sbt中不能定義頂級的val,object,class和方法。 編程
name.:=("hello")
scala name := 42 // will not compile ### Settings are separated by blank lines
// 沒有空行,沒法工做 name := "hello" version := "1.0" scalaVersion := "2.9.2"
sbt須要某種定界符來代表表達式在哪結束,下一個在哪開始。 函數式編程
.sbt文件包含一個Scala表達式列表,它不是完整的Scala程序,這些表達式必須先切分,而後逐個傳給編譯器。 函數
若是想要一個完整的Scala程序,用.scala文件;.sbt文件是可選的。 ui
自定義鍵能夠在.scala文件或插件中定義。 spa
:=是最簡單的轉換。還有其餘方式。例如能夠用+=向一個列表值添加內容。 插件
其餘的轉換須要scopes的知識,因此後面再介紹。 命令行
有三種風味的鍵:(紅燒,清蒸,還有油炸的) scala
InputKey[T]:是一個有命令行參數做爲輸入的任務鍵。入門指南中未涵蓋InputKey。
TaskKey[T]定義一個任務,像compile或package這樣的操做就是任務。任務能夠返回Unit(就是Scala中的void),或返回一個和任務相關聯的值,如package是一個TaskKey[File],它的值就是他建立的jar文件。
每次開始執行一個任務(好比在交互式sbt提示符後輸入compile),sbt都會從新運行一次涉及到的任務。
雖然sbt的映射描述一個項目時,能夠爲諸如name的setting保持一個固定的字符串,可是它必須爲諸如compile這樣的任務保持可執行的代碼——即便可執行代碼最終返回一個字符串,它每次都會從新運行。
一個給定的鍵必須引用一個任務或普通的setting。也就是說,"taskiness"(是否每次從新運行)是這個鍵的屬性,而不是值。
hello := {println("Hello!")}
T和Task[T]隱含的區別是:一個setting key不能依賴一個task key,由於setting key的值只在項目加載的時候評估一次,並且不能重複執行。
在sbt交互模式下,能夠輸入任務的名稱來執行這個任務。所以輸入compile就會運行compile任務,compile是一個task key。
若是輸入一個setting key的名稱,就會顯示setting key的值。輸入task key的名稱會執行任務但不會顯示結果值;要看任務的結果,能夠用show <task name>。
在構建定義文件中,keys以駝峯式命名(沿襲Scala慣例),但在sbt命令行中用 連字符-分隔-單詞 代替。這些在sbt中使用的 連字符-分隔 字符串是在Keys中定義的。例如,在Keys.scala,定義了一個鍵:
val scalacOptions = TaskKey[Seq[String]]("scalac-options", "Options for the Scala compiler.")
要了解更多的鍵,在sbt命令提示符後輸入inspect <keyname>。inspect顯示的有些信息沒什麼意義,可是在頂端展現了setting的值類型,以及它的簡短描述。
import sbt._ import Process._ import Keys._
(此外,若有你有.scala文件,它們的內容(Build或Plugin對象)將會被導入。)
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"libraryDependencies涉及兩個複雜狀況:+=操做符,以及%方法。+=向原來的值中追加,而非替換它。%方法用來從字符串構造ivy模塊ID。