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

如何获取sbt中其他内部命令(非外部命令)的返回码?

获取sbt内部run命令的返回码并控制后续make执行

我来帮你搞定这个需求——要在自定义的sbt命令里捕获run内部命令的返回码,然后根据结果决定是否执行后续的make命令,关键是要正确获取run执行后的退出状态。

解决方案代码

直接替换你原来的makeProject命令实现就行:

import sys.process._
import sbt._

def makeProject = Command.args("make", "<args>") { (state, args) =>
  // 执行sbt内部的run命令,拿到执行后的状态对象
  val runState = Command.process("run", state)
  
  // 从状态中提取run命令的返回码(0=成功,非0=失败)
  val runExitCode = runState.exitCode
  
  if (runExitCode == 0) {
    // run执行成功,拼接并执行make命令
    val makeCommand = s"make ${args.mkString(" ")}"
    println(s"Executing make command: $makeCommand")
    
    val makeExitCode = makeCommand!
    if (makeExitCode != 0) {
      println(s"⚠️ Make command failed with exit code $makeExitCode")
      // 可选:把make的失败码设为整个自定义命令的退出码
      runState.copy(exitCode = makeExitCode)
    } else {
      println("✅ Make command executed successfully")
      runState
    }
  } else {
    println(s"❌ Run command failed with exit code $runExitCode, skipping make")
    // 保持run的失败码作为整个命令的退出状态
    runState
  }
}

关键细节解释

  1. 获取run的返回码:
    使用Command.process("run", state)执行内部命令后,返回的runState对象自带exitCode属性,这就是run命令的执行结果——sbt内部命令执行成功时会返回0,失败则返回对应错误码。

  2. 控制make的执行:
    只有当runExitCode等于0时,才会执行后续的make命令。用makeCommand!执行系统命令,这个方法会阻塞直到命令完成,并返回命令的退出码,方便你进一步处理make的执行结果。

  3. 状态传递:
    最后返回修改后的runState,这样sbt终端能正确感知整个自定义命令的最终退出状态,符合sbt的命令执行逻辑。

内容的提问来源于stack exchange,提问作者wt.cc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:46:37