Являются ли bundle exec и требуют эквивалентности 'bundler/setup'?

Эти вещи делают то же самое?

  • запуск рубинового процесса с bundle exec ruby foo.rb
  • имея require "bundler/setup" в качестве первой строки foo.rb

person Michiel de Mare    schedule 20.06.2012    source источник


Ответы (1)


В вашем конкретном примере их можно считать одинаковыми, однако на самом деле это не одно и то же.

bundle exec вносит некоторые изменения в среду, которые bundler/setup не вносит. Если ваш foo.rb никогда не запускает подоболочку или никогда не пытается запускать другие исполняемые файлы ruby ​​​​в подоболочках, то обе версии эквивалентны (обе они будут правильно загружать связанные драгоценные камни и работать точно так же).

Вся идея bundle exec состоит в том, чтобы дать вам возможность запускать исполняемые файлы, которые изначально не разрабатывались с учетом сборщика. Как rspec, rails, rackup. Если ваше собственное приложение (foo.rb) не пытается запускать такие исполняемые файлы, которые могут зависеть от ваших пакетов, то в любом случае это не имеет значения. Поскольку все, что вы хотите убедиться с помощью bundler, это то, что вы загружаете правильные драгоценные камни, и для этого bundler/setup работает точно так, как ожидалось в вашем случае.

Из документов по сборке, говоря о запуске исполняемых файлов системы ruby:

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

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

Затем из справочной страницы bundle exec вы можете получить дополнительную информацию о том, что на самом деле делает bundle exec:

МОДИФИКАЦИИ ОКРУЖАЮЩЕЙ СРЕДЫ

  • убедитесь, что по-прежнему возможно выполнить сборку внутри команды, вызванной исполняемым пакетом (используя $BUNDLE_BIN_PATH)
  • поместите каталог, содержащий исполняемые файлы (например, rails, rspec, packup) для вашего пакета в $PATH
  • убедитесь, что если упаковщик вызывается в подоболочке, он использует тот же Gemfile (путем установки BUNDLE_GEMFILE)
  • добавьте -rbundler/setup в $RUBYOPT, что гарантирует, что программы Ruby, вызываемые в подоболочке, могут видеть драгоценные камни в пакете.

Поэтому, если вы создаете свое приложение с учетом поддержки сборщиков, вам никогда не понадобится bundle exec приложение.

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

person Casper    schedule 20.06.2012