范围如何影响构建中的键?什么是示波器轴?

时间:2014-09-23 06:48:20

标签: sbt

我试图了解SBT scope axes是什么以及它们如何影响构建地图中的范围键。

有三个范围轴:projectconfigurationtask

  1. 以下元组是构建映射的范围键吗?

    (项目轴的值,配置轴的值,任务轴的值,无范围键的值)

  2. 或者是一个范围键(概念上)一对具有以下三种形式之一?

    (项目轴的值,无范围键的值)

    (配置轴的值,无范围键的值)

    (任务轴的值,无范围键的值)

  3. 或者是作用域的其他内容,如果是的话(概念上)是什么样的?

  4. 那么问题可能是(概念上)什么是范围键?

    1. 这是一个四元组吗?
    2. 是一对吗?
    3. 是否是别的东西,如果是,那么它(概念上)是什么样的?

1 个答案:

答案 0 :(得分:5)

来自Custom settings and tasks

  

密钥有以下三种类型之一:SettingKeyTaskKeyInputKey

密钥的示例可以是:

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]TSettingKey[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])或简称(TSetting[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*/*:abcA/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}}。明确?提问!