Задавать вопросы по рейк-задачам
У меня есть задача rake, вызываемая из другой задачи rake.
В этой задаче rake мне нужно попросить пользователя ввести какой-либо текст, а затем, в зависимости от ответа, либо продолжить, либо остановить все от продолжения (включая задачу вызова rake).
Как я могу это сделать?
Ответы
Ответ 1
task :input_test do
input = ''
STDOUT.puts "What is the airspeed velocity of a swallow?"
input = STDIN.gets.chomp
raise "bah, humbug!" unless input == "an african or european swallow?"
end
task :blah_blah => :input_test do
end
Я думаю, что это должно работать
Ответ 2
task :ask_question do
puts "Do you want to go through with the task(Y/N)?"
get_input
end
task :continue do
puts "Task starting..."
# the task is executed here
end
def get_input
STDOUT.flush
input = STDIN.gets.chomp
case input.upcase
when "Y"
puts "going through with the task.."
Rake::Task['continue'].invoke
when "N"
puts "aborting the task.."
else
puts "Please enter Y or N"
get_input
end
end
Ответ 3
HighLine драгоценный камень делает это легко.
Для простого вопроса "да" или "нет" вы можете использовать agree
:
require "highline/import"
task :agree do
if agree("Shall we continue? ( yes or no )")
puts "Ok, lets go"
else
puts "Exiting"
end
end
Если вы хотите сделать что-то более сложное, используйте ask
:
require "highline/import"
task :ask do
answer = ask("Go left or right?") { |q|
q.default = "left"
q.validate = /^(left|right)$/i
}
if answer.match(/^right$/i)
puts "Going to the right"
else
puts "Going to the left"
end
end
Здесь описание драгоценного камня:
Объект HighLine - это "высокоуровневая линейная ориентированная" оболочка поверх ввода и выходной поток. HighLine упрощает общее взаимодействие консоли, эффективно заменяя puts() и gets(). Пользовательский код может просто указывать вопрос о спросе и любые подробности о взаимодействии с пользователем, а затем оставить остальная часть работы HighLine. Когда HighLine.ask() вернется, вы получите ответ, который вы просили, даже если HighLine пришлось много раз спрашивать, проверять результаты, выполнять проверку диапазона, преобразовывать типы и т.д.
Для получения дополнительной информации вы можете прочитать документы.
Ответ 4
Несмотря на то, что вопрос довольно старый, это может быть интересной (и, возможно, малоизвестной) альтернативой для простого пользовательского ввода для использования внешнего драгоценного камня:
require 'rubygems/user_interaction'
include Gem::UserInteraction
task :input_test do
input = ask("What is the airspeed velocity of a swallow?")
raise "bah, humbug!" unless input == "an african or european swallow?"
end
task :blah_blah => :input_test do
end