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



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



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

817   7  

7 ответов:

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

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

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

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

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

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

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

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

подробнее о на странице.

вот пример Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

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

это приходит много, когда ваш gemfile.замок имеет различные версии драгоценных камней, установленных на вашем компьютере. Вы можете получить предупреждение после запуска грабли (или 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 Tutorial книги).

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

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

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

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

третий вариант-использовать rubygems-bundler драгоценный камень, если вы не используете 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. В этом случае вы не можете предсказать, какая будет использоваться.

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

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

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

Comments

    Ничего не найдено.