Что означает bundle exec rake?

что значит bundle exec rake db:migrate в смысле? Или просто bundle exec rake <command> в целом?

Я понимаю, что bundle заботится о поддержании вещей в Gemfile. Я знаю, что означает слово" exec". Я понимаю это rake поддерживает все различные скриптовые вещи, которые вы можете сделать, и я знаю, что db:migrate это одна из них. Я просто не знаю, что все эти слова делают вместе. Зачем bundle используется для выполнения rake выполнить миграцию базы данных?

7 ответов


bundle exec это упаковщик команда для выполнения скрипта в контексте текущего пакета (из вашего каталога Gemfile). rake db:migrate сценарий, где db пространство имен и перенос название задачи определены.

так bundle exec rake db:migrate выполняет скрипт rake с командой db:migrate в рамках текущего пакета.

Что касается " почему?"Я процитирую из страница bundler:

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

однако, это ненадежно и является источником значительной боли. Даже если кажется, что он работает, он может не работать в будущем или на другой машине.


вы используете bundle exec о программе. Создатели программы написали его, когда были доступны определенные версии gems. Программа Gemfile определяет версии драгоценных камней, которые решили использовать создатели. То есть скрипт был сделан для правильной работы с этими версиями gem.

ваш общесистемный Gemfile может отличаться от этого Gemfile. У вас могут быть новые или старые драгоценные камни, с которыми этот скрипт не играет хорошо. Эта разница в версиях может дать вам странный ошибки.

Bundle exec помогает избежать этих ошибок. Он выполняет сценарий, используя драгоценные камни, указанные в Gemfile сценария, а не общесистемный Gemfile. Он выполняет определенные версии gem с магией псевдонимов оболочки.

подробнее о man page.

вот пример Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

здесь bundle exec выполнит скрипт с использованием rails версии 2.8.3, а не какой-либо другой версии, которую вы, возможно, установили общесистемный.


Это появляется много, когда ваш gemfile.блокировка имеет различные версии драгоценных камней, установленных на вашем компьютере. Вы можете получить предупреждение после запуска rake (или rspec или других), таких как:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

перед bundle exec сообщает bundler выполнить эту команду независимо от дифференциала версии. Однако не всегда есть проблема, вы можете столкнуться с проблемами.

к счастью, есть драгоценный камень, который решает это: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

затем попробуйте свои грабли, rspec или что-то еще.


вероятно, следует упомянуть, что есть способы опустить bundle exec (Они все изложены в главе 3.6.1 Михаила Hartls Ruby on Rails учебник книги).

самое простое-просто использовать достаточно современную версию RVM (>=1.11.икс.)

если вы ограничены более ранней версией RVM, вы всегда можете использовать этот метод, также упомянутый calasyr:

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

на bundler_stubs каталог также должен быть добавил .

третий вариант-использовать rubygems-bundler gem, если вы не используете RVM:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

Я не использовал bundle exec много,но сейчас настраиваю его.

У меня были случаи, когда использовались неправильные грабли и много времени тратилось на отслеживание проблемы. Это поможет вам избежать этого.

вот как настроить rvm, чтобы вы могли использовать bundle exec по умолчанию в определенном каталоге проекта:

http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs


когда вы непосредственно запускаете задачу rake или выполняете любой двоичный файл драгоценного камня, нет никакой гарантии, что команда будет вести себя так, как ожидалось. Потому что может случиться так, что у вас уже есть тот же gem, установленный в вашей системе, у которого есть версия 1.0, но в вашем проекте у вас есть более высокая версия 2.0. В этом случае вы не можете предсказать, какая будет использоваться.

для обеспечения желаемой версии gem вы принимаете помощь bundle exec команда, которая будет выполнять двоичный файл в контекст текущего пакета. Это означает, что при использовании bundle exec bundler проверяет версию gem, настроенную для текущего проекта, и использует ее для выполнения задачи.

Я написал в должности об этом, который также показывает, как мы можем избежать его использования с помощью заглушек bin.


Это означает, что используйте грабли, о которых знает bundler, и является частью вашего Gemfile над любыми граблями, о которых не знает bundler, и запустите задачу db:migrate.