Sbt 这个构建和全局作用域之间有什么区别?

Sbt 这个构建和全局作用域之间有什么区别?,sbt,Sbt,有人能给我解释一下写这两行的区别吗 resolvers in ThisBuild ++= appResolvers resolvers in Global ++= appResolvers 阅读完整的解释 我将引用相关部分: 有三个范围轴: 子项目轴 依赖项配置轴 任务轴 按项目轴划分范围 如果在单个生成中放置多个项目,则每个项目都需要自己的设置。也就是说,可以根据项目确定键的范围 项目轴也可以设置为ThisBuild,这意味着“整个构建”,因此设置应用于整个构建,而不是单个项目。当项目

有人能给我解释一下写这两行的区别吗

resolvers in ThisBuild ++= appResolvers

resolvers in Global ++= appResolvers
阅读完整的解释

我将引用相关部分:

有三个范围轴:

  • 子项目轴
  • 依赖项配置轴
  • 任务轴
按项目轴划分范围 如果在单个生成中放置多个项目,则每个项目都需要自己的设置。也就是说,可以根据项目确定键的范围

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

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

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

Global
是将
Zero
设置为所有轴的作用域:
Zero/Zero/Zero
。换句话说,
Global/someKey
Zero/Zero/Zero/someKey
的缩写

在生成定义中引用作用域 (
Global/concurrentRestrictions
隐式转换为
Zero/Zero/concurrentRestrictions
,将所有轴设置为
Zero
范围组件;默认情况下任务和配置已经是
Zero
,因此这里的效果是使项目
Zero
,即定义
Zero/Zero/Z)ero/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在评论中所指出的,这是一个关键事实,我没有将其包括在上述解释中

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

例如,如果发布配置引用的是
projFoo/version
,则其顺序如下:

  • projFoo/version
  • 此构建/版本
  • 全局/版本
  • 如果默认设置的范围为
    全局
    ,如
    版本
    设置(请参见
    检查版本
    ),使用
    ThisBuild/version
    Global/version
    将能够为构建中的所有项目设置版本号。这里选择
    ThisBuild
    几乎是按照惯例

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


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

    resolvers in Global ++= appResolvers
    
    然而,这可能会出现在生成定义中:

    resolvers in ThisBuild ++= appResolvers
    
    从而允许您覆盖插件提供的全局默认值


    在同一个构建定义中,使用其中任何一个都很可能具有同等的效果,因为它们是代理列表中的最后两个。

    谢谢,我必须再次阅读《入门指南》,因为我没有很好地理解axis部分……顺便说一句,感谢您的精彩scalaz教程:)我还是分不清
    */test:name
    {.}/test:name
    之间的区别,救命!参见我的相关问题:答案中的关键句子是:“如上所述,
    Global
    将所有三个轴设置为
    Global
    ,而
    ThisBuild
    仅将项目轴设置为
    {.}
    ”。这并不能回答为什么需要区分ThisBuild和Global,以及为什么应该使用其中一个或另一个。两者中是否存在任何设置,并且它们之间通常不同?我缺少的链接是SBT文档中的这一行:
    规则4:给定一个范围,通过按以下顺序替换子项目轴来搜索委托范围:给定子项目、ThisBuild,然后是零
    
    resolvers in ThisBuild ++= appResolvers