使用SBT"RootProject"中的常用设置

sgv*_*gvd 10 scala sbt

/sf/answers/1512395671/上的答案显示了如何覆盖RootProject从主项目定义的子项目的一个设置.我想知道是否有一种很好的方法可以为多个设置执行此操作,然后可能还有多个子项目,因此您不必单独列出每个组合.这将是为了防止扩散并减少忘记组合和意外地设置不匹配的机会.

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

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
  )
Run Code Online (Sandbox Code Playgroud)

但是RootProject没有办法设置其设置.根据上面提到的答案,我尝试了类似下面的内容:

lazy val util = RootProject(file("../util"))
commonSettings.map(_.key).foreach(key => key in util := key.value)
Run Code Online (Sandbox Code Playgroud)

但这似乎不是正确的方法.

我已经研究过使用GlobalThisBuild范围,但是每个子项目都在自己的build.sbt文件中设置设置,如果我理解正确的话,它优先于这些更广泛的范围.

有没有一个很好的方法,或者我应该手动设置每个子项目的每个设置?我应该使用不同的范围,例如子项目在其中定义其设置Global和主项目ThisBuild吗?

Jus*_*ser 0

好吧,你可以这样做:

commonSettings.map { s => s.mapKey(Def.mapScope(_.in(util))) }
Run Code Online (Sandbox Code Playgroud)

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

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

但您可能需要考虑是否确实需要将util项目导入RootProject为常规子项目。

  • 这确实有效,非常感谢!我使用 `RootProject` 是因为子项目位于主项目的同级目录中(它由多个项目共享),并且您不能执行 `project in file("../util")`。很高兴了解一种更好的方法,尽管可能不完全符合这个问题的主题。 (2认同)