Подтвердить что ты не робот

Использовать пакетный рейк или просто грабли?

Я изучил Rails, используя только команду rake, например rake db:migrate; однако я прочитал, что я должен использовать bundle exec rake ... вместо простого rake. Теперь я смущен тем, что использовать.

Должен ли я использовать bundle exec rake вместо простого rake или это просто предпочтение? Любое понимание было бы высоко оценено! Спасибо!

4b9b3361

Ответ 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.