Io 在使用capistrano在远程服务器上运行ruby代码时,如何请求用户输入?
我想确认在远程服务器上运行capistrano任务时的操作:Io 在使用capistrano在远程服务器上运行ruby代码时,如何请求用户输入?,io,capistrano,capistrano3,Io,Capistrano,Capistrano3,我想确认在远程服务器上运行capistrano任务时的操作: task :do_someting do on roles(:primary) do within release_path do with rails_env: fetch(:rails_env) do execute :rails, :runner, %Q['require "do_something"; Do::Something.()'] end
task :do_someting do
on roles(:primary) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rails, :runner,
%Q['require "do_something"; Do::Something.()']
end
end
end
end
其中DoSomethig看起来像这样:
require "highline/import"
class DoSomething
def self.call
query_db_for_objects.each do |obj|
answer = ask "Are you sure to do something with #{obj}? (y/n)"
rerun unless answer == 'y'
do_something
end
end
end
当从远程服务器发出请求时,来自highline gem的方法ask
似乎不起作用,命令bundle exec cap production do_something
将永远挂起
运行此capistrano任务时,如何从远程服务器请求用户输入?我能够使用以下ruby代码从远程服务器读取用户答案
task :do_someting do
class ConfirmHandler
def on_data(command, stream_name, data, channel)
if data.to_s =~ /\?$/
prompt = Net::SSH::Prompt.default.start(type: 'confirm')
response = prompt.ask "Please enter your response (y/n)"
channel.send_data "#{response}\n"
end
end
end
on roles(:primary) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rails, :runner,
%Q['require "do_something"; Do::Something.()']
end
end
end
end
其中Do::Something
具有ask\u user
方法,该方法如下所示:
class Do::Something
def self.call
answer = ask_user
puts "Answer is: #{answer}"
end
def self.ask_user
puts 'Do something?'
`read response; echo $response`
end
end