You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  }
}

关键逻辑拆解

  1. 复用命令定义:把自定义命令抽成customCommand这个懒加载变量,所有项目都直接引用它,避免重复写命令逻辑。
  2. 区分当前项目:通过Project.extract(state).currentProject.id判断当前是根项目还是子项目。
  3. 根项目触发子项目:根项目执行时,先获取所有聚合的子项目引用,然后遍历每个子项目,切换当前项目上下文后重新执行customCommand。
  4. 子项目执行动作:子项目执行时,你可以把示例中的打印语句替换成任何你需要的逻辑——比如编译、打包、运行自定义脚本、调用其他SBT任务等。

测试验证

  • 在项目根目录执行:sbt customCommand,你会看到子项目a和b依次执行自定义动作,根项目本身不会输出额外内容。
  • 单独进入子项目执行:比如sbt "project a" customCommand,只会看到子项目a执行动作,不会影响其他项目。

内容的提问来源于stack exchange,提问作者nosmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:27