【问题标题】:Use common settings in SBT `RootProject`使用 SBT `RootProject` 中的常用设置
【发布时间】:2016-11-22 10:29:36
【问题描述】:

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 中定义主项目?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    可以这样做:

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

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

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

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

    【讨论】:

    • 确实有效,非常感谢!我使用RootProject,因为子项目在主项目的同级目录中(它由多个项目共享),你不能这样做project in file("../util")。了解一种更好的方法会很棒,尽管可能不完全是这个问题的主题。
    • 如果util 不需要自己的构建,您可以通过直接添加到unmanagedSourceDirectories 来包含。
    • 从 sbt 1.5.0 开始,.in 语法被标记为已弃用并要求使用斜杠语法。
    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2014-03-31
    • 2013-11-18
    • 2017-01-25
    • 1970-01-01
    • 2014-02-18
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多