Что означает сбой exec exec?
Что такое bundle exec rake db:migrate
mean? Или просто bundle exec rake
вообще?
Я понимаю, что bundle
заботится о сохранении вещей в Gemfile. Я знаю, что означает слово «exec». Я понимаю, что rake
поддерживает все различные сценарии, которые вы можете сделать, и я знаю, что db:migrate
является одним из них. Я просто не знаю, что все эти слова делают вместе. Зачем использовать bundle
для выполнения rake
для выполнения миграции базы данных?
- Сделать упаковщик использовать разные драгоценные камни для разных платформ
- Bundler :: GemNotFound: не удалось найти rake-10.3.2 в любом из источников
- Проблемы с Ruby on Rails и Rake: неинициализированная константа Rake :: DSL
- Могу ли я получить имя текущего controllerа в представлении?
- Rails new vs create
- Rails: переменная экземпляра controllerа доступа в файле ресурса CoffeeScript или JavaScript
- Задача cron для рельсов: лучшие практики?
- Выполнение переопределения рейков по умолчанию
- Лучший способ загрузить модуль / class из папки lib в Rails 3?
- Лучший способ генерировать пули (удобочитаемые идентификаторы) в Rails
bundle exec
– это команда Bundler для выполнения скрипта в контексте текущего пакета (одного из Gemfile вашего каталога). rake db:migrate
– это скрипт, где db – пространство имен, а migrate – заданное имя задачи.
Поэтому bundle exec rake db:migrate
выполняет скрипт rake с помощью команды db:migrate
в контексте текущего пакета.
Что касается «почему?» Я приведу цитату со страницы поставщика :
В некоторых случаях выполнение исполняемых файлов без
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.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 или что-то еще.
Следует, наверное, упомянуть, что есть способы опустить bundle exec
(все они указаны в главе 3.6.1 книги Майкла Хартлса Ruby on Rails Tutorial ).
Проще всего просто использовать достаточно обновленную версию 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
Я не использовал bundle exec много, но сейчас настраиваю его.
У меня были случаи, когда использовался неправильный грабли, и много времени тратилось на устранение проблемы. Это поможет вам избежать этого.
Вот как настроить rvm, чтобы вы могли использовать пакет exec по умолчанию в определенном каталоге проекта:
http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs
Когда вы запускаете задачу rake или выполняете любой двоичный файл драгоценного камня, нет никакой гарантии, что команда будет вести себя так, как ожидалось. Поскольку может случиться так, что у вас уже установлен один и тот же камень, установленный в вашей системе, у которого есть версия 1.0, но в вашем проекте у вас более высокая версия 2.0. В этом случае вы не можете предсказать, какой из них будет использоваться.
Для обеспечения требуемой версии gem вы берете с собой команду bundle exec
которая будет выполнять двоичный код в контексте текущего пакета. Это означает, что когда вы используете bundle exec, bundler проверяет версию gem, настроенную для текущего проекта, и использует ее для выполнения задачи.
Я также написал сообщение об этом, которое также показывает, как мы можем избежать использования его с помощью заглушек bin.
Это означает использование рейка, который связной знает и является частью вашего Gemfile по любому рейку, который поставщик не знает и запускает задачу db: migrate.