Вопрос по ruby, bundler – Является ли bundle exec и требует ли 'bundler / setup' эквивалент?

16

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

  • starting a ruby process with bundle exec ruby foo.rb
  • having require "bundler/setup" as the first line of foo.rb

Ваш Ответ

1   ответ
23

specific Например, их можно считать одинаковыми, однако в действительности они не одинаковы.

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

Вся идея сbundle exec чтобы позволить вамrun executables тотwere not originally designed with bundler in mind, подобноrspec, rails, rackup, Если ваше собственное приложение (foo.rb) не пытается запускать такие исполняемые файлы, которые могут зависеть от ваших пакетов, тогда это не имеет значения в любом случае. Так как все, что вы хотите убедиться с помощью bundler, это то, что вы загружаете правильные гемы, и для этогоbundler/setup работает точно так, как и ожидалось в вашем случае.

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

In some cases, running executables without bundle exec may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle.

However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine.

Тогда изManage of bundle exec Вы можете получить некоторые дополнительные подсказки относительно того, чтоbundle exec на самом деле делает:

ENVIRONMENT MODIFICATIONS

make sure that it's still possible to shell out to bundle from inside a command invoked by bundle exec (using $BUNDLE_BIN_PATH) put the directory containing executables (like rails, rspec, rackup) for your bundle on $PATH make sure that if bundler is invoked in the subshell, it uses the same Gemfile (by setting BUNDLE_GEMFILE) add -rbundler/setup to $RUBYOPT, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle

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

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

Отличный ответ, большое спасибо! Michiel de Mare

Похожие вопросы