如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置

Posted

技术标签:

【中文标题】如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置【英文标题】:How can I override settings in subprojects in an SBT project with multiple subprojects 【发布时间】:2020-06-08 14:40:24 【问题描述】:

我有一个项目,其子项目在子目录中添加为 git 子模块,每个独立项目都有自己的 build.sbt 文件。根项目依赖并聚合这些子项目。如何在这些子项目中覆盖设置值(例如 organizationversion)?

lazy val p1 = (project in file("p1"))
  .settings(organization := "xyz.abc") // This does not work :(

lazy val root = (project in file("."))
  .dependsOn(p1)
  .aggregate(p1)

【问题讨论】:

【参考方案1】:

尝试将状态覆盖放在onLoad

类型为State => State,在所有项目完成后执行一次 构建并加载。

例如,

lazy val settingsAlreadyOverriden = SettingKey[Boolean]("settingsAlreadyOverriden","Has overrideSettings command already run?")
settingsAlreadyOverriden := false
commands += Command.command("overrideSettings")  state =>
  if (settingsAlreadyOverriden.value) 
    state
   else 
    Project.extract(state).appendWithSession(
      Seq(
        settingsAlreadyOverriden := true,
        subprojectA / organization := "kerfuffle.org",
      ),
      state
    )
  


onLoad in Global := 
  ((s: State) =>  "overrideSettings" :: s ) compose (onLoad in Global).value

settingsAlreadyOverriden 是Avoiding recursive onLoad execution #3544 所必需的

相关问题

SBT: Override setting in multi-build dependsOn/aggregate project How can I apply setting changes on onLoad hook in SBT?

【讨论】:

非常感谢@Marco!这就像一个魅力。在子项目settings 内设置Global / onLoad 与在主build.sbt 的全局范围内设置Global / onLoad 之间有区别吗,除了惰性评估的明显不确定性?

以上是关于如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sbt 子项目 build.sbt 文件中获取对当前项目的引用

sbt:子项目的动态聚合

SBT:多构建依赖/聚合项目中的覆盖设置

sbt 子项目的项目目录

Sbt autoplugin 覆盖项目设置

SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件