首页 > 解决方案 > sbt 中的 settings(inThisBuild(...)) 是什么意思?

问题描述

我刚刚使用 scalaxb 模板生成了一个 sbt 项目:

sbt new eed3si9n/scalaxb.g8

我得到了这个build.sbt文件:

lazy val root = (project in file(".")).
  enablePlugins(ScalaxbPlugin).
  settings(inThisBuild(List(
    organization  := "com.example",
    scalaVersion  := "2.13.2",
    crossScalaVersions := Seq("2.13.2", "2.12.12")
  ))).
  settings(
    name          := "test-scalaxb",
    libraryDependencies ++= Seq(dispatch, scalaXml, scalaParser)
  ).
  settings(
    scalaxbDispatchVersion in (Compile, scalaxb) := dispatchV,
    scalaxbPackageName in (Compile, scalaxb)     := "generated"
  )

inThisBuild内部是什么settings意思(第 3 行)?我通常在文件的根级别看到它build.sbt,而不是在settings. 它与根本没有inThisBuild(例如namelibraryDependencies在上面的文件中)有什么不同?

标签: sbt

解决方案


inThisBuild内是什么settings意思?

在语义上,它意味着等同于:

ThisBuild / organization  := "com.example"
ThisBuild / scalaVersion  := "2.13.2"
ThisBuild / crossScalaVersions := Seq("2.13.2", "2.12.12")

今天,我推荐使用ThisBuild / organization. 我可能应该更新我的旧 Giter8 模板。

元细节

sbt 有一个辅助函数调用设置序列以将它们限定为inConfig(Compile)(List(setting1, ...))配置,这对于定义一次设置序列并在 , 等中重用它很有用。mapCompileCompileTest

2015 年,Dale 贡献了另一个名为 的辅助函数inThisBuild(List(setting1, ...)),类似于inConfig(Compile)(...)将列表范围限定为ThisBuild范围。这是由于 sbt 0.13 中的作用域被编写为organization in ThisBuild而不是 2018 年引入的斜杠语法。

我通常在文件的根级别看到它build.sbt,而不是在settings.

在根级别编写build.sbt称为裸样式build.sbt。使用裸样式在语义上编写设置序列(包括inThisBuild(...))与将它们放入构建.settings(...)的根子项目(位于的子项目file("."))中相同。2016,当我将那行添加到 eed3si9n/scalaxb.g8 时,我想我比今天致力于摆脱裸露的风格build.sbt,所以我拒绝inThisBuild(...)直接写build.sbt,而是把它放进去.settings(...)

如上所述,我在 2018 年引入了斜杠语法,这让我对ThisBuild / scalaVersion使用裸样式(并且仅用于ThisBuild / ...Global / ...设置)有所了解,因此它与 shell 语法相同。

构建范围的设置

它与根本没有inThisBuild(例如namelibraryDependencies在上面的文件中)有什么不同?

请参阅构建范围的设置

要考虑跨多个项目的通用设置,请将设置范围定义为ThisBuild. 限制是右侧需要是纯值或范围为Globalor的设置ThisBuild,并且没有范围为子项目的默认设置。

ThisBuild基本上是提供的特殊子项目名称,因此您可以为构建定义默认设置。当您定义一个或多个子项目时,当子项目未定义scalaVersion时,它将回退到ThisBuild / scalaVersion.


推荐阅读