Использовать грабли bundle exec или просто грабли? - PullRequest
76 голосов
/ 26 ноября 2011

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

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

Ответы [ 3 ]

119 голосов
/ 26 ноября 2011

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.

5 голосов
/ 09 сентября 2014

$ bundle exec rake db: migrate
Использует версию rake, указанную в Gemfile, для выполнения задачи rake db:migrate.

Но в Gemfile не указан гем rake!
Да, но гем rake был установлен как зависимость какого-то другого гема - смотрите в Gemfile.lock.Таким образом, правило должно быть следующим: использовать версию rake, указанную в Gemfile.lock.

Но Gemfile.lock не указывает конкретную версию - он указывает версию, превышающую xy!
Тогда должно быть правило: Используется версия рейка, которая была установленав текущем наборе драгоценных камней.

$ rake db: migrate
Обычно, когда вы вводите команду в командной строке, например, rake, ваша система ищет команду в списке каталогов, указанном в вашем PATHпеременная окружения.Первый каталог, который содержит команду, является версией используемой команды.Чтобы увидеть, что это за каталог, вы можете сделать:

$ which rake

Так что если вы выполните,

$ rake db:migrate

, то может использовать другой камень рейка, чем тотвы установили с bundle install.Но даже если ваша система найдет ту же версию рейка, что и bundle exec, любые драгоценные камни, требуемые исходным кодом rake, будут искать в местах за пределами набора гемов вашего проекта.Поэтому есть много способов, которыми просто:

$ rake db:migrate

может испортить вещи.

Согласно разделу 3.6 учебника по Ruby on Rails (бесплатно онлайн), если вы используете rvm 1.11.x +, вам не нужно вводить команды с bundle exec.

1 голос
/ 29 апреля 2014

при запуске любого исполняемого файла без bundle exec Rubygems будет извлекать последнюю версию гема, установленного в вашей системе.

При добавлении префикса bundle exec вместо этого будет выполняться исполняемый файл в контексте вашего Gemfile..lock, что означает, что он будет запущен с использованием версии, определенной в файле gem.

...