1. 设置初始化

设置初始化 

本页概述了 sbt 加载特定构建设置的机制,包括用户可以控制所有内容排序的钩子。

如其他地方所述,sbt 通过 Setting[_] 对象构建其初始化图和任务图。设置是可以用构建状态中的其他 Keys 中存储的值生成特定构建键的新值的东西。sbt 将所有注册的 Setting[_] 对象转换为一个巨大的线性序列,并将其编译成一个任务图。然后使用此任务图来执行构建。

sbt 的所有加载语义都包含在 Load.scala 文件中。它大约如下所示

image

蓝色圆圈代表 sbt 加载项目时发生的 action。我们可以看到,sbt 在加载时执行以下操作

  1. 编译用户级项目(~/.sbt/<version>/

    a. 加载此项目定义的任何插件(~/.sbt/<version>/plugins/*.sbt~/.sbt/<version>/plugins/project/*.scala) b. 加载所有定义的设置(~/.sbt/<version>/*.sbt~/.sbt/<version>/plugins/*.scala

  2. 编译当前项目(<working-directory/project

    a. 加载所有定义的插件(project/plugins.sbtproject/project/*.scala) b. 加载/编译项目(project/*.scala

  3. 加载项目 *.sbt 文件(build.sbt 及其朋友)。

每个加载都定义了几个设置序列。该图显示了两个最重要的

  • buildSettings - 这些是在 in ThisBuild 或直接针对 Build 对象定义的设置。它们在构建时初始化一次。您可以添加这些,例如在 build.sbt 文件中

    ThisBuild / foo := "hi"
    
  • projectSettings - 这些是特定于项目的设置。它们特定于构建中的特定子项目。插件可能会将其设置贡献给多个项目,在这种情况下,这些值将针对每个项目进行复制。您可以添加特定于项目的设置,例如在 project/build.scala

    lazy val root = (project in file(".")).settings(...)
    

在加载/编译所有构建定义后,sbt 有一个 Seq[Setting[_]] 序列,它必须对其进行排序。如该图所示,sbt 的默认包含顺序为

  1. 所有 AutoPlugin 设置
  2. 用户目录中定义的所有设置(~/.sbt/<version>/*.sbt
  3. 所有本地配置(build.sbt