Как явно выполнить задачу в рубиновом грабли?
Скажем, у меня есть файл рейка:
file 'file1' => some_dependencies do
sh 'external tool I do not have control over, which sometimes fail to create the file'
???
end
task :default => 'file1' do
puts "everything OK"
end
Теперь, если я ничего не ставил вместо???, я получаю сообщение OK, даже если внешнему инструменту не удается создать файл. Каков надлежащий способ информирования грабли, что задача "file1" потерпела неудачу, и она должна прерваться (надеюсь, что она представляет значимое сообщение, например, какая неудачная задача) - единственное, о чем я могу думать сейчас, - это создать там исключение, но это просто не кажется правильным.
P.S Инструмент всегда возвращает 0 в качестве кода выхода.
Ответы
Ответ 1
Используйте метод raise
или fail
, как и для любого другого Ruby script (fail
является псевдонимом для raise
). Этот метод принимает строку или исключение в качестве аргумента, который используется как сообщение об ошибке, отображаемое при завершении script. Это также приведет к тому, что script вернет значение 1 в вызывающую оболочку. Это документировано здесь и в других местах.
Ответ 2
Вы можете использовать abort("message")
, чтобы изящно выполнить команду rake.
Он выведет message
в stdout и выйдет с кодом 1.
Код выхода 1 является сбоем в Unix-подобных системах.
Подробнее см. Kernel # abort.