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 / scalacOptions
和ThisBuild / ...
。
现在让我们把它的价值用在我们的任务中。但它的价值是什么?它指的是没有明确定义的projD / Zero / Zero / scalacOptions
。所以我们需要为它找到一个代表。目前我们还没有与projD / Compile
和projD / 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.