How the scope delegation works in SBT?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了How the scope delegation works in SBT?相关的知识,希望对你有一定的参考价值。

我已经阅读了reference以了解范围授权如何在SBT中运作。

从上面的参考页面中,我摘录了一个练习D.

ThisBuild / scalacOptions += "-Ywarn-unused-import"

lazy val projD = (project in file("d"))
  .settings(
    test := {
      println((Compile / console / scalacOptions).value)
    },
    console / scalacOptions -= "-Ywarn-unused-import",
    Compile / scalacOptions := scalacOptions.value // added by sbt
  )

如果你运行projD / test,你会看到什么?

名单()

清单(-Ywarn-unused-import)

别的什么?

他们的推理是

答案是List(-Ywarn-unused-import)。规则2找到projD / Compile / Zero,规则3找到projD / Zero / console,规则4找到ThisBuild / Zero / Zero。规则1选择projD / Compile / Zero,因为它具有子项目轴projD,并且配置轴具有比任务轴更高的优先级。

到目前为止一切顺利,我可以理解为什么Compile / console / sclacOptions将作用于projD / Compile / zero / scalacOptions。这是因为与我们想知道的密钥(Compile / console / scalacOptions)相比,projD / Compile / zero的配置轴比projD / zero / console更具体。

接下来,Compile / scalacOptions引用scalacOptions.value,接下来我们需要找到projD / Zero / Zero的委托。规则4找到ThisBuild / Zero / Zero,因此它解析为List(-Ywarn-unused-import)。

在这里,我无法理解为什么ThisBuild / Zero / Zero赢得projD / Compile / Zero。因为我们想要找到的键的范围是projD / zero / zero,所以projD / Compile / zero与Thisbuild [遵循参考中的规则1]相比具有更具体的值。

我认为原因是Compile / scalacOptions具有scalacOptions.value的值,它生成递归定义。然后,我们可以使用projD / Zero / console。

答案

我想你在解释的第二部分中对差异范围的引用有点困惑。让我们明确地写下示例中的所有范围:

ThisBuild / Zero / Zero / scalacOptions += "-Ywarn-unused-import"

lazy val projD = (project in file("d"))
  .settings(
    test := { println((Compile / console / scalacOptions).value) }
  )

projD / Zero / console / scalacOptions -= "-Ywarn-unused-import"
projD / Compile / Zero / scalacOptions := (projD / Zero / Zero / scalacOptions).value

我不得不取出这两个设置,以便能够引用projD,但除此之外它的定义相同。

所以从第一部分你就明白projD / Compile / Zero / scalacOptions胜过projD / Zero / console / scalacOptionsThisBuild / ...

现在让我们把它的价值用在我们的任务中。但它的价值是什么?它指的是没有明确定义的projD / Zero / Zero / scalacOptions。所以我们需要为它找到一个代表。目前我们还没有与projD / CompileprojD / console竞争,范围唯一合适的关键是ThisBuild / Zero / Zero

我试着在这里说明一下(省略qazxsw poi以节省空间):

/ scalacOptions

以上是关于How the scope delegation works in SBT?的主要内容,如果未能解决你的问题,请参考以下文章

Tip of the Week #74: Delegating and Inheriting Constructors

Tip of the Week #74: Delegating and Inheriting Constructors

How to Pronounce the Months of the Year

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedRe

The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified.

How the Bitcoin protocol actually works