Как мне прервать Buildr изящно?

Я запускаю Buildr в двух разных средах (Windows XP и Linux), и поэтому у меня локальные установки Java и Scala в разных местах. У меня есть следующая практика, чтобы проверить, что переменные среды установлены:

require 'buildr/scala'
# Can I put these checks on a function ? How ?
ENV['JAVA_HOME'] ||= Buildr.settings.user['java_home']
if ENV['JAVA_HOME'].nil? then
  puts "Required environment variable JAVA_HOME was not set. Value can also be set in personal settings."
  Process.exit 1
end
puts 'JAVA_HOME = ' + ENV['JAVA_HOME']

ENV['SCALA_HOME'] ||= Buildr.settings.user['scala_home']
if ENV['SCALA_HOME'].nil? then
  puts "Required environment variable SCALA_HOME was not set. Value can also be set in personal settings."
  Process.exit 1
end
puts 'SCALA_HOME = ' + ENV['SCALA_HOME']

puts 'Scala version: ' + Scala.version

define "HelloWorld" do
  puts 'Hello World !'
end

Но как мне выйти из Buildr, чтобы он выходил с таким сообщением:

Buildr aborted!
RuntimeError : Scala compiler crashed:
#<NullPointerException: unknown exception>
(See full trace by running task with --trace)

Должен ли я выдать исключение (если да, как это сделать в Ruby)?

1 ответ

Решение

Пытаться fail:

if ENV['SCALA_HOME'].nil? then
  fail "Required environment variable SCALA_HOME was not set. Value can also be set in personal settings."
end

fail выдает исключение в ruby. Вы также можете увидеть это называется raise; они эквивалентны. Если вы не укажете тип, тип исключения будет RuntimeError как в вашем примере "сбой компилятора".

Бонусный ответ: если вы хотите поместить эти проверки в функцию (как следует из первого комментария), вы можете создать каталог с именем tasks на верхнем уровне вашего проекта, затем поместите файл с .rake расширение в нем. Определите свои функции там. Buildr загрузит все такие файлы перед оценкой вашего buildfile.

Например, вы можете иметь файл с именем tasks/helpers.rake с этим содержанием:

def initialize_environment
  ENV['JAVA_HOME'] ||= Buildr.settings.user['java_home']
  unless ENV['JAVA_HOME']
    fail "Required environment variable JAVA_HOME was not set. Value can also be set in personal settings."
  end
  puts "JAVA_HOME = #{ENV['JAVA_HOME']}"
  # etc.
end

(Примечание: я изменил пару других деталей - unlessСтроковая интерполяция - чтобы быть более рубиновой. То, как ты это делал, тоже было хорошо, если ты предпочитаешь это.)

Тогда в верхней части вашего buildfile у вас может быть это:

require 'buildr/scala'
initialize_environment
# etc.
Другие вопросы по тегам