Scala 在SBT`RootProject中使用常用设置`

Scala 在SBT`RootProject中使用常用设置`,scala,sbt,Scala,Sbt,处的答案显示了如何覆盖主项目中使用RootProject定义的子项目的一个设置。我想知道是否有一种很好的方法可以用于多个设置,然后也可以用于多个子项目,这样您就不必单独列出每个组合。这将是为了防止扩散,减少忘记组合和意外设置不匹配的机会 当不使用RootProject时,将显示如何使用常见的设置序列执行此操作: lazy val commonSettings = Seq( organization := "com.example", version := "0.1.0", scala

处的答案显示了如何覆盖主项目中使用
RootProject
定义的子项目的一个设置。我想知道是否有一种很好的方法可以用于多个设置,然后也可以用于多个子项目,这样您就不必单独列出每个组合。这将是为了防止扩散,减少忘记组合和意外设置不匹配的机会

当不使用
RootProject
时,将显示如何使用常见的设置序列执行此操作:

lazy val commonSettings = Seq(
  organization := "com.example",
  version := "0.1.0",
  scalaVersion := "2.11.8"
)

lazy val core = (project in file("core")).
  settings(commonSettings: _*).
  settings(
    // other settings
  )

lazy val util = (project in file("util")).
  settings(commonSettings: _*).
  settings(
    // other settings
  )
但是
RootProject
没有设置其设置的方法。根据上面提到的答案,我尝试了以下方法:

lazy val util = RootProject(file("../util"))
commonSettings.map(_.key).foreach(key => key in util := key.value)
但这似乎不是正确的方法

我曾研究过使用
Global
ThisBuild
范围,但每个子项目都在其自己的
build.sbt
文件中设置,如果我理解正确,该文件优先于这些更广泛的范围

是否有一种很好的方法可以做到这一点,或者我应该手动设置每个子项目的每个设置?我是否应该使用不同的范围,例如,子项目在
全局中定义其设置,主项目在
此构建中定义其设置?

您可以这样做:

这将创建新的
Seq[Setting[\u]]
,其中每个设置的作用域都更改为在
util
项目中。这是sbt文件中的有效条目

另一个选项是定义一个sbt插件,将其添加到主项目和RootProject自己的build.sbt中


但您可能需要考虑,如果您真的需要导入<代码> UTI.<代码>项目作为<代码> RootProject <代码>,而不是常规子项目。

确实有效,非常感谢!我使用
RootProject
,因为子项目位于主项目的同级目录中(它由多个项目共享),您不能在文件(“../util”)中执行
project
。了解更好的方法会很好,尽管可能不完全是关于这个问题的主题。如果
util
不需要自己的构建,您可以通过直接添加到
unmanagedSourceDirectories
来包含。自sbt 1.5.0以来,
中的
.in语法被标记为不推荐,并要求使用斜杠语法。
commonSettings.map { s => s.mapKey(Def.mapScope(_.in(util))) }