settings(inThisBuild(…))在sbt中是什么意思?

我刚刚使用 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"
  )

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

回答

什么是inThisBuildsettings是什么意思?

从语义上讲,它意味着与:

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, ...)),以map在设置顺序将它们范围Compile的配置,它是用于限定设定序列一次和在重复使用它有用CompileTest

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. 限制是右侧需要是纯值或范围为Global或 的设置ThisBuild,并且没有范围为子项目的默认设置。

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


以上是settings(inThisBuild(…))在sbt中是什么意思?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>