问题描述
Capistrano 3不再使用命令cap env shell
。
现在我们应该使用cap env console
但是它不是交互式的,例如,我们不能使用箭头键来记录或tab
按钮上的自动完成
那我该怎么办?
解决方法
我建议编写自己的小耙子任务来完成。使用readline
宝石
首先要感谢以下材料:
-
https://thoughtbot.com/blog/tab-completion-in-gnu-readline-ruby-edition
-
How to write a Ruby command line app that supports tab completion?
desc "Remote console"
task :console do
require 'readline'
# https://thoughtbot.com/blog/tab-completion-in-gnu-readline-ruby-edition
host_args = (ENV['HOSTS'] || '').split(',').map { |r| r.to_sym }
role_args = (ENV['ROLES'] || '').split(',').map { |r| r.to_sym }
LIST = `ls /usr/bin`.split("\n").sort + `ls /bin`.split("\n").sort
comp = proc { |s| LIST.grep(/^#{Regexp.escape(s)}/) }
Readline.completion_append_character = " "
Readline.completion_proc = comp
while line = Readline.readline('cap> ',true)
begin
next if line.strip.empty?
exec_cmd(line,host_args,role_args)
rescue StandardError => e
puts e
puts e.backtrace
end
end
end
def exec_cmd(line,role_args)
line = "RAILS_ENV=#{fetch(:stage)} #{line}" if fetch(:stage)
cmd = "bash -lc '#{line}'"
puts "Final command: #{cmd}"
if host_args.any?
on hosts host_args do
execute cmd
end
elsif role_args.any?
on roles role_args do
execute cmd
end
else
on roles :all do
execute cmd
end
end
end
做点什么,加油! =))