2013-05-10 2 views
2

В чем основное отличие между запуском команды rake с и без bundle exec?Разница между командой запуска рейка с и без пучка exec

Я видел несколько сообщений, в которых говорилось, что когда вы запускаете команду с помощью пакета exec, она будет запускаться в объеме версии gems, определенной в файле gem. Если это так, тогда должно быть обязательным выполнение команды rake с помощью «bundle exec» ??

ответ

2

bundle exec rake some:task выполняет задачу рейка в контексте вашего пакета.

Вы не явно указать Rails, но я вижу, что вы пост с тегами Rails так надуманный примера этого в действии может быть следующим:

У вас есть версия 2.0 фиктивного whateva-whateva драгоценного камня установленный в вашей системе по какой-либо веской причине.

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

Итак, текущее состояние: ваше старое приложение-рельс имеет комплект жемчужинок, который включает более старую версию whateva-whateva, а ваши общесистемные драгоценные камни включают более новую версию драгоценного камня whateva-whateva.

Когда вы запускаете задачи рейка, связанные с вашим Rails-приложением, какую версию вы хотите загрузить? Старейший, конечно.

Для этого вы можете использовать bundle exec rake the:task, и он запускает команду rake в контексте вашего пакета - более старую версию драгоценного камня плюс любые другие материалы, указанные в Gemfile старого rails.

Итак, после всего этого, я думаю, можно с уверенностью сказать, что ЛУЧШАЯ практика будет заключаться в том, что вы всегда должны предлагать bundle exec, но, честно говоря, я довольно ленив и редко делаю это, если не вижу проблем.

В других новостях, если вы используете binstubs Bundler, вам не нужно его добавлять. Вот ссылка на настройки, что до: http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

1

BUNDLE_GEMFILE=/path/to/gemfile bundle exec может быть использована для предшествуют любую команду (если BUNDLE_GEMFILE не указан, что производит поиск в файловой системе и использует первый найденный), а не только rake.

Любая команда, которую вы запускаете, может вызывать исполняемые команды Ruby (например, rake) или требуется код из библиотек Ruby (например, класс Rake::Task), и эти вещи обычно предоставляются драгоценными камнями. gem env сообщает вам, где находятся библиотеки и исполняемые файлы, предоставленные gem. Однако если вы используете bundle exec, он ограничивает доступные драгоценные камни теми, которые указаны в файле Gemfile.lock, связанном с Gemfile, который использует ваш bundle exec контекст.

Используя все имеющиеся драгоценные камни на вашей машине (что может произойти, если вы не сделаете bundle exec) может быть нежелательным по нескольким причинам:

  • Вы можете иметь несовместимости в вашем полном наборе драгоценных камней.
  • Труднее сказать, какие именно камни вы используете, добавив непредсказуемость в вашу рабочую среду.

Вот быстрый способ увидеть разницу.

  1. gem install thin
  2. Создание каталога foo с двумя файлами: пустой Gemfile и файл foo.rb с содержимым:
    #! /usr/bin/ruby (or whatever the path to your system Ruby is)
    require 'thin'
  3. Сделать foo.rb исполняемый файл.
  4. Обратите внимание, что работа и ./foo.rb из командной строки обе работы, но предшествующие либо с bundle exec не будут работать.
0

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

Предположим, у вас есть 2 приложения и с использованием разных рубиновых версий для каждого из них. Без пуска exec команда может быть не запущена, так как для выполнения этой задачи может потребоваться разная версия Gem. Но если вы начнете использовать bundle exec Для запуска задачи/приложения потребуется точная версия gem.

I recommend you to use **bundle exec** before any command.

0

пачке Exec - Выполнить команду в контексте расслоения

Эта команда выполняет команду, делая все драгоценные камни, указанные в (5) доступны Gemfile требовать в программах на Ruby.

Это не для единственного грабли, а применимо также для рельсов, rspec, команды rackup.

По существу, если бы вы обычно запускали что-то вроде rspec spec/my_spec.rb, и вы хотите использовать драгоценные камни, указанные в Gemfile (5) и установленные через установку пакета (1), вы должны запустить пакет exec rspec спецификации/my_spec.rb.

Обратите внимание, что пакет exec не требует наличия исполняемого файла в $ PATH вашей оболочки.

Для получения более подробной информации, обратитесь к bundle exec doc.