Как явно выполнить задачу в рубиновом грабли?

Скажем, у меня есть файл рейка:

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.