Использовать пакетный рейк или просто грабли?
Я изучил Rails, используя только команду rake, например rake db:migrate
; однако я прочитал, что я должен использовать bundle exec rake ...
вместо простого rake
. Теперь я смущен тем, что использовать.
Должен ли я использовать bundle exec rake
вместо простого rake
или это просто предпочтение? Любое понимание было бы высоко оценено! Спасибо!
Ответы
Ответ 1
bundle exec
выполняет команду в контексте вашего пакета.
Это означает, что он использует драгоценные камни, указанные в вашем Gemfile. В большинстве случаев запуск bundle exec rake foo
имеет такие же результаты, как если бы вы просто запускали rake foo
, особенно если у вас есть те же самые драгоценные камни, которые установлены в системе, как в вашем Gemfile. Тем не менее, некоторые приложения могут указывать разные версии драгоценных камней, чем те, которые вы установили в масштабах всей системы, и могут хотеть, чтобы эти точные драгоценные камни и версии могли работать правильно. Если вы просто запускаете без bundle exec
, вы можете получить некоторые странные ошибки.
Использование bundle exec
гарантирует, что программа запущена с средой, указанной в gemfile, что, надеюсь, означает, что это среда, в которой создатели программы хотят, чтобы она была запущена, что, надеюсь, означает, что она должна работать правильно независимо от того, какая странная настройка у вас на вашем компьютере.
Он в основном стандартизирует среду, в которой запускается программа. Это помогает избежать ада версии и облегчает жизнь.
Подробнее см. http://bundler.io/v1.3/man/bundle-exec.1.html.
Ответ 2
$bundle exec rake db: migrate
Использует версию рейка, указанную в Gemfile, для выполнения команды rake db:migrate
.
Но в Gemfile нет грабля-граната!
Да, но граблей был установлен как зависимость от какого-то другого драгоценного камня - посмотрите в Gemfile.lock. Таким образом, правило должно быть: Использует версию рейка, указанную в Gemfile.lock.
Но Gemfile.lock не указывает конкретную версию - она указывает версию, большую, чем x.y!
Тогда правило должно быть: Использует версию грабли, которая была установлена в текущем gemset.
$rake db: migrate
Обычно, когда вы выдаете команду в командной строке, например. rake, ваша система выполняет поиск команды в списке каталогов, указанных в переменной среды PATH. Первый каталог, содержащий эту команду, - это версия используемой команды. Чтобы узнать, в какой директории вы можете:
$ which rake
Итак, если вы выполните,
$ rake db:migrate
который может использовать другой грабли, чем тот, который вы установили с помощью bundle install
. Но даже если ваша система найдет ту же версию рейка, что и bundle exec
, любые камни, требуемые исходным кодом рейка, будут найдены в местах вне вашего проекта gemset. Поэтому существует множество способов, которые просто:
$ rake db:migrate
может повредить вещи.
В соответствии с учебной книгой Ruby on Rails (бесплатно в Интернете), раздел 3.6, если вы используете rvm 1.11.x +, тогда вам не нужно вводить команды с bundle exec
.
Ответ 3
запуск любого exacutable без bundle exec
будет иметь Rubygems, получающий последнюю версию gem, установленной в вашей системе.
Вместо добавления префикса bundle exec
будет выполняться исполняемый файл в контексте вашего Gemfile.lock, что означает, что он будет запущен с использованием версии, определенной в файле gem.