【问题标题】:What is the difference between ThisBuild and Global scopes?ThisBuild 和 Global 范围有什么区别?
【发布时间】:2013-08-19 19:56:54
【问题描述】:

谁能解释一下写这两行的区别:

resolvers in ThisBuild ++= appResolvers

resolvers in Global ++= appResolvers

【问题讨论】:

    标签: sbt


    【解决方案1】:

    阅读Scopes了解完整说明。

    我将引用相关部分:

    共有三个范围轴:

    • 子项目轴
    • 依赖配置轴
    • 任务轴

    项目轴范围

    如果您将多个项目放在一个构建中,则每个项目都需要自己的设置。也就是说,可以根据项目来确定键的范围。

    项目轴也可以设置为ThisBuild,这意味着“整个构建”,因此设置适用于整个构建而不是单个项目。当项目没有定义项目特定的设置时,构建级设置通常用作后备。

    零范围组件

    每个范围轴都可以用轴类型的实例填充(类似于Some(_)),或者可以用特殊值Zero 填充轴。所以我们可以将Zero 视为None

    Zero 是所有范围轴的通用后备,但在大多数情况下,它的直接使用应保留给 sbt 和插件作者。

    Global 是将Zero 设置为所有轴的范围:Zero / Zero / Zero。换句话说,Global / someKeyZero / Zero / Zero / someKey 的简写。

    在构建定义中引用作用域

    Global / concurrentRestrictions := Seq(
      Tags.limitAll(1)
    )
    

    (Global / concurrentRestrictions隐式转换为Zero / Zero / Zero / concurrentRestrictions,将所有轴设置为Zero范围组件;任务和配置默认已经Zero,所以这里的效果是使项目Zero,即是,定义Zero / Zero / Zero / concurrentRestrictions而不是ProjectRef(uri("file:/tmp/hello/"), "root") / Zero / Zero / concurrentRestrictions)

    如上所述,Global 将所有三个轴设置为Zero,而ThisBuild 仅将子项目轴设置为ThisBuild。如果您将 ThisBuild 与其他轴(如配置)结合使用,这可能是有意义的:

    > set ThisBuild / Test / name := "test-name"
    [info] Defining ThisBuild / Test / name
    

    2020 年 2 月更新:正如 Stefan K 在评论 scope delegation rule 中指出的那样,这是我没有在上述解释中包含的一个关键事实。

    规则 4:给定一个范围,通过按以下顺序替换子项目轴来搜索委托范围:给定的子项目 ThisBuild,然后是 Zero

    例如,如果发布配置引用projFoo / version,它将按以下顺序查找:

    1. projFoo / version
    2. ThisBuild / version
    3. Global / version

    如果默认设置范围为Global,例如version 设置(请参阅inspect version),则使用ThisBuild / versionGlobal / version 将能够为所有项目设置版本号在构建中。这里ThisBuild的选择几乎是约定俗成的。

    有时可能需要区分这两个范围。首先是源依赖。 sbt 有一个内置的支持来依赖跨多个构建的子项目。在这些情况下,使用 ThisBuild 可以防止一个设置溢出到其他构建。

    在某些情况下,某些功能专门引用全局范围的设置,通常用于配置命令的行为和/或 sbt 本身的行为。 Global / concurrentRestrictions 就是一个例子。在这种情况下,必须使用Global / concurrentRestrictions

    【讨论】:

    • 谢谢,将不得不再次阅读入门指南,因为我没有很好地掌握那个轴部分...顺便感谢您提供的 scalaz 教程 :)
    • 我还是分不清*/test:name{.}/test:name的区别,求救!请参阅我的相关问题:stackoverflow.com/questions/25841527/…
    • 答案的关键语句是:“如上所述,Global所有三个轴 设置为 GlobalThisBuild 设置 仅项目轴{.}。".
    • 这没有回答为什么需要区分 ThisBuild 和 Global 以及为什么应该使用一个或另一个。两者中是否存在任何设置并且它们之间通常不同?
    • 对我来说缺少的链接是 SBT 文档中的这一行:Rule 4: Given a scope, delegate scopes are searched by substituting the subproject axis in the following order: the given subproject, ThisBuild, and then Zero.
    【解决方案2】:

    这可能会在插件中使用:

    resolvers in Global ++= appResolvers
    

    而这可能会出现在您的构建定义中:

    resolvers in ThisBuild ++= appResolvers
    

    从而让您覆盖插件提供的全局默认值。

    在同一个构建定义中,使用其中任何一个很可能会产生相同的效果,因为它们是委托列表中的最后两个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 2014-12-22
      • 2012-12-11
      • 2015-09-22
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多