Подтвердить что ты не робот

Можно ли сделать интерактивную задачу Rake?

Я хочу запустить задачу Rake, которая запрашивает у пользователя ввод.

Я знаю, что я могу предоставить ввод в командной строке, но я хочу спросить у пользователя, уверены ли они, что они захотят перейти к конкретному действию в случае, если они ошибочно приняли одно из значений, заданных для задачи Rake.

4b9b3361

Ответ 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