Что bundle exec rake db:migrate
значит? Или просто bundle exec rake <command>
в общем?
Я понимаю, что bundle
заботится о сохранении вещей в Gemfile. Я знаю, что означает слово «exec». Я понимаю, что это rake
поддерживает все разные вещи, которые вы можете сделать, и я знаю, что db:migrate
это одна из них. Я просто не знаю, что все эти слова делают вместе. Почему следует bundle
использовать для выполнения rake
миграции базы данных?
источник
bundle
это команда, которая используется Bundler..ruby-gemset
файл в корне вашего проекта. Существует также.ruby-version
файл, который устанавливает вашу версию ruby при использовании RVM.Вы работаете
bundle exec
в программе. Создатели программы написали это, когда были доступны определенные версии драгоценных камней. Программа Gemfile указывает версии драгоценных камней, которые решили использовать создатели. То есть скрипт был создан для правильной работы с этими версиями гемов.Ваш общесистемный Gemfile может отличаться от этого Gemfile. У вас могут быть новые или более старые драгоценные камни, с которыми этот сценарий не играет хорошо. Эта разница в версиях может привести к странным ошибкам.
bundle exec
поможет вам избежать этих ошибок. Он выполняет скрипт, используя гемы, указанные в Gemfile скрипта, а не общесистемный Gemfile. Он выполняет определенные версии драгоценных камней с магией псевдонимов оболочки.Смотрите больше на странице man .
Вот пример Gemfile:
Здесь
bundle exec
будет выполняться скрипт с использованием rails версии 2.8.3, а не какой-либо другой версии, которую вы, возможно, установили для всей системы.источник
rake db:migrate
уходя,bundle exec
то он выполнялся бы с использованием общесистемного Gemfile, где у него может быть стойка на 1.5.2 (самое позднее)?bundle exec
использует «специфичные для приложения» локальные гемы в вашем Gemfile вашего приложения иbundle
использует «специфичные для машины» глобальные гемы, если вы это сделалиgem install a_certain_gem
. местный против глобальногоЭто часто встречается, когда на вашем компьютере установлены различные версии gemfile.lock. Вы можете получить предупреждение после запуска рейка (или 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
говорит бандеру выполнить эту команду независимо от разницы версий. Не всегда есть проблема, однако, вы можете столкнуться с проблемами.К счастью, есть жемчужина, которая решает это: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Тогда попробуйте снова свои грабли, rspec или что-то еще.
источник
Вероятно, следует упомянуть, что есть способы пропустить
bundle exec
(все они изложены в главе 3.6.1 учебника Майкла Хартла по Ruby on Rails ).Самое простое - просто использовать достаточно актуальную версию RVM (> = 1.11.x).
Если вы ограничены более ранней версией RVM, вы всегда можете использовать этот метод, также упомянутый calasyr :
bundler_stubs
Каталог также должен затем быть добавлены к.gitignore
файл.Третий вариант - использовать
rubygems-bundler
гем, если вы не используете RVM:источник
Когда вы напрямую запускаете задачу rake или запускаете какой-либо двоичный файл гема, нет гарантии, что команда будет работать так, как ожидается. Может случиться так, что в вашей системе уже установлен тот же самый гем с версией 1.0, но в вашем проекте более поздняя версия 2.0. В этом случае вы не можете предсказать, какой из них будет использоваться.
Для обеспечения желаемой версии гема вы используете
bundle exec
команду, которая будет выполнять двоичный файл в контексте текущего пакета. Это означает, что когда вы используете bundle exec, bundler проверяет версию gem, настроенную для текущего проекта, и использует ее для выполнения задачи.Я также написал пост об этом, который также показывает, как мы можем избежать его использования с помощью заглушек bin.
источник
Я не использовал
bundle exec
много, но сейчас настраиваю.У меня были случаи, когда использовались неправильные грабли, и я тратил много времени на поиск проблемы. Это поможет вам избежать этого.
Вот как настроить RVM, чтобы вы могли использовать
bundle exec
по умолчанию в определенном каталоге проекта:https://thoughtbot.com/blog/use-bundlers-binstubs
источник
Это означает использование rake, о котором осведомлен упаковщик, и который является частью вашего Gemfile, поверх любых граблей, о которых не знает упаковщик, и запустите задачу db: migrate.
источник