Capistrano 3 exécute une commande arbitraire sur un serveur distant

Aug 28 2020

Capistrano 3 n'utilise plus la commande cap env shell.

Maintenant, nous devrions utiliser cap env console

Mais ce n'est pas interactif et on ne peut pas utiliser par exemple les touches fléchées pour l'historique ou la saisie semi-automatique sur le tabbouton

Et que dois-je faire?

Réponses

1 Alexey Aug 28 2020 at 16:44

Je suggère d'écrire votre propre petite tâche de râteau pour le faire. Utilisez la readlinegemme Tout d'abord merci de suivre les matériaux:

  1. https://thoughtbot.com/blog/tab-completion-in-gnu-readline-ruby-edition

  2. Comment écrire une application de ligne de commande Ruby prenant en charge la complétion des onglets?


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, host_args, 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


Et faites ce que vous voulez avec, bravo! =))