SBT多项目结构自定义命令实现需求咨询(附代码)
解决SBT多项目中自定义命令的需求
我来帮你搞定这个SBT多项目自定义命令的需求,刚好之前处理过类似场景,给你一个完整的可运行方案,完全符合你的要求:根项目执行命令时不做自身操作,但触发所有子项目执行;子项目执行时运行指定动作。
完整实现代码
先直接上能跑的build.sbt代码,后面再拆解解释:
lazy val root = (project in file(".")) .settings( name := "Custom command", commands += customCommand ) .aggregate(a, b) lazy val a = (project in file("a")) .settings( commands += customCommand ) lazy val b = (project in file("b")) .settings( commands += customCommand ) // 自定义命令的核心实现 lazy val customCommand = Command.command("customCommand") { state => // 获取当前执行命令的项目ID val currentProjId = Project.extract(state).currentProject.id if (currentProjId == "root") { // 根项目逻辑:触发所有聚合的子项目执行该命令 val subProjectRefs = Project.extract(state).structure.allProjectRefs.filter(_.id != "root") // 遍历子项目,逐个触发命令 subProjectRefs.foldLeft(state) { (updatedState, projRef) => Command.process("customCommand", updatedState.copy(currentRef = projRef)) } } else { // 子项目逻辑:这里替换成你需要执行的指定动作 println(s"✅ 正在子项目[$currentProjId]中执行自定义命令...") // 示例:可以添加任意自定义逻辑,比如调用编译任务、执行脚本等 // 比如要触发子项目编译:Command.process("compile", state) state } }
关键逻辑拆解
- 复用命令定义:把自定义命令抽成
customCommand这个懒加载变量,所有项目都直接引用它,避免重复写命令逻辑。 - 区分当前项目:通过
Project.extract(state).currentProject.id判断当前是根项目还是子项目。 - 根项目触发子项目:根项目执行时,先获取所有聚合的子项目引用,然后遍历每个子项目,切换当前项目上下文后重新执行
customCommand。 - 子项目执行动作:子项目执行时,你可以把示例中的打印语句替换成任何你需要的逻辑——比如编译、打包、运行自定义脚本、调用其他SBT任务等。
测试验证
- 在项目根目录执行:
sbt customCommand,你会看到子项目a和b依次执行自定义动作,根项目本身不会输出额外内容。 - 单独进入子项目执行:比如
sbt "project a" customCommand,只会看到子项目a执行动作,不会影响其他项目。
内容的提问来源于stack exchange,提问作者nosmo
相关产品推荐
相关产品推荐

