【问题标题】:How can I override settings in subprojects in an SBT project with multiple subprojects如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置
【发布时间】: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)

【问题讨论】:

    标签: scala build sbt


    【解决方案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
    }
    

    settingsAlreadyOverridenAvoiding recursive onLoad execution #3544 所必需的

    相关问题

    【讨论】:

    • 非常感谢@Marco!这就像一个魅力。在子项目settings 内设置Global / onLoad 与在主build.sbt 的全局范围内设置Global / onLoad 之间有区别吗,除了惰性评估的明显不确定性?
    猜你喜欢
    • 2018-04-09
    • 2017-02-28
    • 2019-01-23
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2012-12-13
    • 2014-06-05
    • 2017-12-27
    相关资源
    最近更新 更多