2014-09-23 43 views
4

我想了解SBT scope axes是什麼以及它們如何影響構建映射中的範圍鍵。範圍如何影響構建中的鍵?什麼是範圍軸?

有三個示波器軸:project,configurationtask

  1. 下面的元組是構建映射的範圍鍵嗎?

    (項目軸的值,配置軸的值,任務軸的值,無作用域鍵的值)

  2. 或者是一個範圍的鍵(在概念上)具有以下三種形式中的一種的一對?

    (項目軸,無作用域密鑰的值的值)

    (配置軸,無作用域密鑰的值的值)

    (任務軸,無作用域密鑰的值的值)

  3. 或者是其他範圍的關鍵,如果是的話它是怎樣的(概念上)?

所以這個問題可能是(概念上)範圍內的關鍵?

  1. 它是一個四元組嗎?
  2. 這是一對嗎?
  3. 是否是別的,如果是的話,那麼它是怎麼樣的(概念上)?

回答

5

Custom settings and tasks

鍵有三種類型:SettingKeyTaskKeyInputKey

一個關鍵的一個例子可以是:

> 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]或經由:=+=++=只是TSettingKey[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" 

inspectreload後重新加載構建的變化):

> 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鍵每個範圍具有不同的值 - ThisBuildGlobal。明確?請走!

+0

哇!謝謝你的詳細解答Jacek! – jhegedus 2014-09-24 13:56:47

+0

謝謝**你**!不斷詢問,直到完成(並且可以成爲官方文檔的一部分 - 這是我的願望)。 – 2014-09-24 14:58:41

+0

你是什麼意思「你分配一個Initialize [T]到一個SettingKey [T]」?根據文檔,:=方法取值爲T型。我很困惑。 T如何初始化[T]?他們是通過繼承關係嗎? – jhegedus 2014-09-24 21:53:49