我试图了解SBT scope axes是什么以及它们如何影响构建地图中的范围键。
有三个范围轴:project
,configuration
和task
。
以下元组是构建映射的范围键吗?
(项目轴的值,配置轴的值,任务轴的值,无范围键的值)
或者是一个范围键(概念上)一对具有以下三种形式之一?
(项目轴的值,无范围键的值)
(配置轴的值,无范围键的值)
(任务轴的值,无范围键的值)
或者是作用域的其他内容,如果是的话(概念上)是什么样的?
那么问题可能是(概念上)什么是范围键?
答案 0 :(得分:5)
密钥有以下三种类型之一:
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
。很快得到解释。
在为其分配值(通过计算)之前,您无法在构建中看到该键。您可以通过Initialize[T]
,T
和SettingKey[T]
(更常用和推荐)或{{:=
向+=
或++=
分配<++=
或<+=
1}},<<=
和abc := "my value"
运算符(在sbt.SettingKey的scaladoc中描述的Scala方法)。
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允许在*: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
和{{1}}。明确?提问!