如何在自定义Capistrano任务中实现--trace标志的输出控制?
解决方案
可以利用Capistrano/SSHKit的内置输出 verbosity 机制实现需求,这是官方推荐的方式,无需临时拼凑:
- 在任务中添加判断逻辑,根据当前是否启用
--trace模式(对应SSHKit的output_verbosity为:debug),决定是否添加输出重定向到/dev/null的参数。 - 将原命令中的硬编码
>/dev/null替换为动态变量。
修改后的任务代码如下:
task :build_release do SSHKit.config.command_map.prefix[:mix].unshift("#{fetch(:asdf_wrapper_path)}") SSHKit.config.default_env[:MIX_ENV] = 'prod' # 根据输出 verbosity 判断是否静默输出:--trace 模式下 verbosity 为 :debug,不静默 output_silencer = SSHKit.config.output_verbosity == :debug ? '' : '>/dev/null' on roles(:app) do |host| within release_path do execute(:mix, "deps.get --only prod #{output_silencer}") execute(:mix, "compile #{output_silencer}") execute(:mix, "assets.deploy #{output_silencer}") execute(:mix, "phx.gen.release #{output_silencer}") execute(:mix, "release #{output_silencer}") end end end
原理说明
当你运行Capistrano命令时添加--trace参数,SSHKit会自动将output_verbosity设置为:debug级别,此时判断逻辑会跳过输出重定向,让所有mix任务的原始输出显示出来;正常运行时(无--trace),output_verbosity为默认的:info或更低级别,输出会被重定向到/dev/null保持简洁。
这种方式完全基于Capistrano/SSHKit的官方设计,没有使用任何临时拼凑的逻辑。
内容的提问来源于stack exchange,提问作者user341493
相关产品推荐
相关产品推荐

