ThisBuild和Global范围有什么区别?

问题描述 投票:35回答:2

有人可以解释一下这两行的区别吗?

resolvers in ThisBuild ++= appResolvers

resolvers in Global ++= appResolvers
sbt
2个回答
25
投票

阅读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
  • ThisBuild / version
  • Global / version
  • 如果默认设置的作用域为Global,如version设置(请参阅inspect version),则使用ThisBuild / versionGlobal / version都可以为其中的所有项目设置版本号构建。此处ThisBuild的选择几乎符合惯例。

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

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

    这可能会在插件中使用:

    resolvers in Global ++= appResolvers
    

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

    resolvers in ThisBuild ++= appResolvers
    

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

    在相同的构建定义中,使用任何一个都将具有同等的效果,因为它们是代表列表中的底部两个。


    9
    投票

    这可能会在插件中使用:

    © www.soinside.com 2019 - 2024. All rights reserved.