如何获取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 } }
关键细节解释
获取
run的返回码:
使用Command.process("run", state)执行内部命令后,返回的runState对象自带exitCode属性,这就是run命令的执行结果——sbt内部命令执行成功时会返回0,失败则返回对应错误码。控制
make的执行:
只有当runExitCode等于0时,才会执行后续的make命令。用makeCommand!执行系统命令,这个方法会阻塞直到命令完成,并返回命令的退出码,方便你进一步处理make的执行结果。状态传递:
最后返回修改后的runState,这样sbt终端能正确感知整个自定义命令的最终退出状态,符合sbt的命令执行逻辑。
内容的提问来源于stack exchange,提问作者wt.cc
相关产品推荐
相关产品推荐

