從Custom settings and tasks:
鍵有三種類型:SettingKey
,TaskKey
和InputKey
。
一個關鍵的一個例子可以是:
> show scalaVersion
[info] 2.10.4
執行inspect
來了解:
val scalaVersion = settingKey[String]("The version of Scala used for building.")
它在SBT和查詢的價值,你執行show
是默認情況下可用一個關鍵的細節(它不完全是一個關鍵,但你很快就會學習一個設置):
> inspect scalaVersion
[info] Setting: java.lang.String = 2.10.4
[info] Description:
[info] The version of Scala used for building.
[info] Provided by:
[info] */*:scalaVersion
[info] Defined at:
[info] (sbt.Defaults) Defaults.scala:236
[info] Reverse dependencies:
[info] *:libraryDependencies
[info] *:scalaInstance
[info] *:evicted
[info] *:dependencyUpdatesData
[info] *:update
[info] *:allDependencies
[info] Delegates:
[info] *:scalaVersion
[info] {.}/*:scalaVersion
[info] */*:scalaVersion
[info] Related:
[info] */*:scalaVersion
可以與宏settingKey
定義自己的鍵:
lazy val abc: sbt.SettingKey[String] = settingKey[String]("My own setting key")
據sbt.SettingKey的scaladoc:
標識的設置。它由三部分組成:範圍,名稱和與此關鍵字關聯的值的類型。範圍由Scope類型的值表示。名稱和類型由AttributeKey [T]類型的值表示。實例是使用伴隨對象構建的。
正如你可以在scaladoc看到,任何SettingKey
具有所需def scope: Scope
描述設定的範圍。很快就要解釋。
除非您爲其指定值(通過計算),否則無法在構建中看到該鍵。你指定一個Initialize[T]
或經由:=
,+=
和++=
只是T
到SettingKey[T]
(更經常地使用,並且推薦)或<++=
,<+=
<<=
和運營商(即是在sbt.SettingKey的scaladoc描述Scala的方法)。
abc := "my value"
上面一行等效於以下行(他們是可以互換):
final def :=(v: T): Def.Setting[T]
的結果:
abc.:=("my value")
正如你可以在:=
定義見它是Setting[T]
。
所以,一對(SettingKey[T]
,Initialize[T]
)或簡單地(SettingKey[T]
,T
)是Setting[T]
。
Setting[T]
類型的設置,其中T
是設置評估結果的值的類型,描述了對構建中所有設置的地圖的轉換。這是一個在構建加載後在一個鍵下可用的值的配方。
現在,最後一部分,範圍。
正如你可能已經注意到的那樣,一個設置總是在一個範圍內。您可以使用final def in(scope: Scope): SettingKey[T]
更改設置的範圍。使用inspect
瞭解設置。
> inspect abc
[info] Setting: java.lang.String = my value
[info] Description:
[info] My new setting key
[info] Provided by:
[info] {file:/Users/jacek/sandbox/sbt-theory/}sbt-theory/*:abc
[info] Defined at:
[info] /Users/jacek/sandbox/sbt-theory/build.sbt:3
[info] Delegates:
[info] *:abc
[info] {.}/*:abc
[info] */*:abc
你可以看到,設置代表(部分Delegates
)到*:abc
,{.}/*:abc
和*/*:abc
。我要描述爲A/B:K
的其他地方是A
- 項目軸,B
- 配置軸和K
關鍵或任務範圍(因爲sbt允許出現在::
之後的屬性)。
猜猜*:abc
的值是多少。 inspect
吧。
> inspect *:abc
[info] Setting: java.lang.String = my value
[info] Description:
[info] My new setting key
[info] Provided by:
[info] {file:/Users/jacek/sandbox/sbt-theory/}sbt-theory/*:abc
[info] Defined at:
[info] /Users/jacek/sandbox/sbt-theory/build.sbt:3
[info] Delegates:
[info] *:abc
[info] {.}/*:abc
[info] */*:abc
你猜怎麼着對應於這個版本在全局配置*
表示爲{.}
的的{.}/*:abc
值。 inspect
吧。
> inspect {.}/*:abc
[info] No entry for key.
[info] Description:
[info] My new setting key
[info] Delegates:
[info] {.}/*:abc
[info] */*:abc
[info] Related:
[info] *:abc
有在ThisBuild
(又名thisBuild
)範圍abc
設置任何價值。使用build.sbt
設置:
它
abc in ThisBuild := "abc in ThisBuild"
inspect
(reload
後重新加載構建的變化):
> inspect {.}/*:abc
[info] Setting: java.lang.String = abc in ThisBuild
[info] Description:
[info] My new setting key
[info] Provided by:
[info] {file:/Users/jacek/sandbox/sbt-theory/}/*:abc
[info] Defined at:
[info] /Users/jacek/sandbox/sbt-theory/build.sbt:5
[info] Delegates:
[info] {.}/*:abc
[info] */*:abc
[info] Related:
[info] *:abc
隨着build.sbt
看起來如下變化:
lazy val abc: sbt.SettingKey[String] = settingKey[String]("My new setting key")
abc := "my value"
abc in ThisBuild := "abc in ThisBuild"
,指出有abc
鍵每個範圍具有不同的值 - ThisBuild
和Global
。明確?請走!
哇!謝謝你的詳細解答Jacek! – jhegedus 2014-09-24 13:56:47
謝謝**你**!不斷詢問,直到完成(並且可以成爲官方文檔的一部分 - 這是我的願望)。 – 2014-09-24 14:58:41
你是什麼意思「你分配一個Initialize [T]到一個SettingKey [T]」?根據文檔,:=方法取值爲T型。我很困惑。 T如何初始化[T]?他們是通過繼承關係嗎? – jhegedus 2014-09-24 21:53:49