Что означает комплектация exec rake?

293

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

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

Теги:
rake
bundler

6 ответов

421
Лучший ответ

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

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

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

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

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

  • 3
    Спасибо, очень познавательно.
  • 0
    лучшее объяснение, что означает пакет exec. Благодарю.
Показать ещё 8 комментариев
117

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

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

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

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

Вот пример Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

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

  • 9
    Мне нравится этот ответ лучше, чем выбранный ОП: D! Гораздо понятнее.
  • 1
    Итак, добавим к этому примеру: если человек просто запустит rake db:migrate оставив exe bundle exec то он будет выполняться с использованием общесистемного Gemfile, где может быть стеллаж 1.5.0 (не позднее)?
Показать ещё 3 комментария
7

Это очень много, когда ваш 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 или что-то еще.

  • 0
    Отлично! решаемая
6

Следует, наверное, упомянуть, что есть способы опустить 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
1

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

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню