Можно ли сделать интерактивную задачу Rake?
Я хочу запустить задачу Rake, которая запрашивает у пользователя ввод.
Я знаю, что я могу предоставить ввод в командной строке, но я хочу спросить у пользователя, уверены ли они, что они захотят перейти к конкретному действию в случае, если они ошибочно приняли одно из значений, заданных для задачи Rake.
Ответы
Ответ 1
Что-то вроде этого может работать
task :action do
STDOUT.puts "I'm acting!"
end
task :check do
STDOUT.puts "Are you sure? (y/n)"
input = STDIN.gets.strip
if input == 'y'
Rake::Task["action"].reenable
Rake::Task["action"].invoke
else
STDOUT.puts "So sorry for the confusion"
end
end
Повторное включение и вызов задачи из Как запускать задачи Rake из задач Rake?
Ответ 2
Удобная функция для пользовательского ввода состоит в том, чтобы поместить ее в цикл do..while
, чтобы продолжить, только когда пользователь предоставил действительный ввод. Ruby явно не имеет эту конструкцию, но вы можете достичь того же с помощью begin
и until
. Это добавит принятый ответ следующим образом:
task :action do
STDOUT.puts "I'm acting!"
end
task :check do
# Loop until the user supplies a valid option
begin
STDOUT.puts "Are you sure? (y/n)"
input = STDIN.gets.strip.downcase
end until %w(y n).include?(input)
if input == 'y'
Rake::Task["action"].reenable
Rake::Task["action"].invoke
else
# We know at this point that they've explicitly said no,
# rather than fumble the keyboard
STDOUT.puts "So sorry for the confusion"
end
end
Ответ 3
Здесь приведен пример без использования другой задачи.
task :solve_earth_problems => :environment do
STDOUT.puts "This is risky. Are you sure? (y/n)"
begin
input = STDIN.gets.strip.downcase
end until %w(y n).include?(input)
if input != 'y'
STDOUT.puts "So sorry for the confusion"
return
end
# user accepted, carry on
Humanity.wipe_out!
end