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"
)
inThisBuild内settings是什么意思(第 3 行)?我通常在build.sbt文件的根级别看到它,而不是在settings. 它与根本没有inThisBuild(例如name,libraryDependencies在上面的文件中)有什么不同?
回答
什么是
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, ...)),以map在设置顺序将它们范围Compile的配置,它是用于限定设定序列一次和在重复使用它有用Compile,Test等
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(例如name,libraryDependencies在上面的文件中)有什么不同?
请参阅构建范围设置:
要将跨多个项目的通用设置分解出来,请将设置范围定义为
ThisBuild. 限制是右侧需要是纯值或范围为Global或 的设置ThisBuild,并且没有范围为子项目的默认设置。
ThisBuild基本上是提供的特殊子项目名称,以便您可以为构建定义默认设置。当您定义一个或多个子项目时,并且当子项目未定义时scalaVersion,它将回退到ThisBuild / scalaVersion.