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

Что такое bundle exec rake db:migrate mean? Или просто bundle exec rake вообще?

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

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.

Interesting Posts

Можно ли использовать 2 Mac mini для создания распределенной вычислительной системы

Xcode 4 – создать выходной каталог

Доступ к синтаксической ошибке SQL при использовании OleDbCommandBuilder

Windows 7 автоматически снижает объем приложений

Как я могу найти количество секунд, прошедших с полуночи с Java?

Адреса двух указателей одинаковы

Что использовать вместо «addPreferencesFromResource» в PreferenceActivity?

Разбор комбинации обратного слэша и косой черты в имени файла

Почему не является законным преобразовывать «указатель на указатель на не-const» в «указатель на указатель на const»,

Связывание для свертывания события в Twitter Загрузочный файл 3

Использование службы для запуска фона и создания уведомлений

Создание утечки памяти с помощью Java

Создание специальных команд для Notepad ++ с помощью NppExec

Нужна помощь в создании расширенной команды контекстного меню в Windows 7 (x64)

Как объявить переменную, которая имеет тип и реализует протокол?

Давайте будем гением компьютера.