如何在具有多个子项目的 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
文件。根项目依赖并聚合这些子项目。如何在这些子项目中覆盖设置值(例如 organization
或 version
)?
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 项目中覆盖子项目中的设置的主要内容,如果未能解决你的问题,请参考以下文章