来自Custom settings and tasks:
密钥具有以下三种类型之一:SettingKey、TaskKey 和 InputKey。
键的示例可以是:
val scalaVersion = settingKey[String]("The version of Scala used for building.")
它在 sbt 中默认可用,并且可以查询你执行的值show:
> show scalaVersion
[info] 2.10.4
执行inspect 以了解密钥的详细信息(这不完全是密钥,而是您很快就会了解的设置):
> 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。很快就会解释。
在为它分配一个值(通过计算)之前,您无法看到构建中的键。您通过:=、+= 和++=(更经常使用和推荐)或<++=、<+= 和<<= 运算符(即是 sbt.SettingKey 的 scaladoc 中描述的 Scala 方法。
abc := "my value"
上面的行等同于下面的行(它们可以互换):
abc.:=("my value")
正如你在:=的定义中看到的:
final def :=(v: T): Def.Setting[T]
它的结果是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 允许出现在 @ 之后的属性987654368@).
猜猜*: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
abc 设置在ThisBuild(又名thisBuild)范围内没有任何价值。在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。清除?问吧!