Что означает сбой exec exec?

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

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

Ответ 1

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

Итак bundle exec rake db:migrate выполняет команду rake script с помощью команды db:migrate в контексте текущего пакета.

Что касается "почему?" Я приведу ссылку на страницу поставщика:

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

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

Ответ 2

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

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

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

Подробнее на странице руководства.

Вот пример Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

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

Ответ 3

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

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

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

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

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

Ответ 4

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

Проще всего просто использовать достаточно обновленную версию RVM ( >= 1.11.x).

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

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

Затем каталог bundler_stubs должен быть добавлен в файл .gitignore.

Третий вариант - использовать драгоценный камень rubygems-bundler, если вы не используете RVM:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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