Подтвердить что ты не робот

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

Выполняют ли эти вещи точно то же самое?

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

Ответ 1

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

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

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

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

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

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

Затем из manpage пакета bundle вы можете получить дополнительные подсказки относительно того, что действительно делает bundle exec:

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

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

Итак, если вы создаете приложение с поддержкой пакета, помните, что вам не нужно bundle exec ваше приложение.

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