https://stackoverflow.com/a/21605652/1737727的答案显示了如何覆盖主项目中用RootProject定义的子项目的一种设置。我想知道是否有一种不错的方法可以对多个设置进行此操作,然后对多个子项目也可以进行此操作,因此您不必单独列出每个组合。这将是为了防止扩散并减少忘记组合以及意外地设置不匹配的机会。

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

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)

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

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

有什么好方法吗,还是我应该手动为每个子项目设置每个设置?我应该使用其他范围吗?子项目在Global中定义其设置,主项目在ThisBuild中定义?

最佳答案

好吧,你可以这样做:

commonSettings.map { s => s.mapKey(Def.mapScope(_.in(util))) }

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

另一个选择是定义一个sbt插件,该插件可以添加到主项目中,也可以添加到RootProject自己的build.sbt中。

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

关于scala - 在SBT中使用常用设置 `RootProject`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38460033/

10-16 04:12
查看更多