mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
181 lines
6.8 KiB
Text
181 lines
6.8 KiB
Text
BUNDLE-EXEC(1) BUNDLE-EXEC(1)
|
|
|
|
|
|
|
|
NAME
|
|
bundle-exec - Execute a command in the context of the bundle
|
|
|
|
SYNOPSIS
|
|
bundle exec [--keep-file-descriptors] command
|
|
|
|
DESCRIPTION
|
|
This command executes the command, making all gems specified in the
|
|
[Gemfile(5)][Gemfile(5)] available to require in Ruby programs.
|
|
|
|
Essentially, if you would normally have run something like rspec
|
|
spec/my_spec.rb, and you want to use the gems specified in the
|
|
[Gemfile(5)][Gemfile(5)] and installed via bundle install(1)
|
|
bundle-install.1.html, you should run bundle exec rspec
|
|
spec/my_spec.rb.
|
|
|
|
Note that bundle exec does not require that an executable is available
|
|
on your shell's $PATH.
|
|
|
|
OPTIONS
|
|
--keep-file-descriptors
|
|
Exec in Ruby 2.0 began discarding non-standard file descriptors.
|
|
When this flag is passed, exec will revert to the 1.9 behaviour
|
|
of passing all file descriptors to the new process.
|
|
|
|
BUNDLE INSTALL --BINSTUBS
|
|
If you use the --binstubs flag in bundle install(1)
|
|
bundle-install.1.html, Bundler will automatically create a directory
|
|
(which defaults to app_root/bin) containing all of the executables
|
|
available from gems in the bundle.
|
|
|
|
After using --binstubs, bin/rspec spec/my_spec.rb is identical to
|
|
bundle exec rspec spec/my_spec.rb.
|
|
|
|
ENVIRONMENT MODIFICATIONS
|
|
bundle exec makes a number of changes to the shell environment, then
|
|
executes the command you specify in full.
|
|
|
|
o make sure that it's still possible to shell out to bundle from
|
|
inside a command invoked by bundle exec (using $BUNDLE_BIN_PATH)
|
|
|
|
o put the directory containing executables (like rails, rspec,
|
|
rackup) for your bundle on $PATH
|
|
|
|
o make sure that if bundler is invoked in the subshell, it uses the
|
|
same Gemfile (by setting BUNDLE_GEMFILE)
|
|
|
|
o add -rbundler/setup to $RUBYOPT, which makes sure that Ruby
|
|
programs invoked in the subshell can see the gems in the bundle
|
|
|
|
|
|
|
|
It also modifies Rubygems:
|
|
|
|
o disallow loading additional gems not in the bundle
|
|
|
|
o modify the gem method to be a no-op if a gem matching the
|
|
requirements is in the bundle, and to raise a Gem::LoadError if
|
|
it's not
|
|
|
|
o Define Gem.refresh to be a no-op, since the source index is always
|
|
frozen when using bundler, and to prevent gems from the system
|
|
leaking into the environment
|
|
|
|
o Override Gem.bin_path to use the gems in the bundle, making system
|
|
executables work
|
|
|
|
o Add all gems in the bundle into Gem.loaded_specs
|
|
|
|
|
|
|
|
Finally, bundle exec also implicitly modifies Gemfile.lock if the
|
|
lockfile and the Gemfile do not match. Bundler needs the Gemfile to
|
|
determine things such as a gem's groups, autorequire, and platforms,
|
|
etc., and that information isn't stored in the lockfile. The Gemfile
|
|
and lockfile must be synced in order to bundle exec successfully, so
|
|
bundle exec updates the lockfile beforehand.
|
|
|
|
Loading
|
|
By default, when attempting to bundle exec to a file with a ruby
|
|
shebang, Bundler will Kernel.load that file instead of using
|
|
Kernel.exec. For the vast majority of cases, this is a performance
|
|
improvement. In a rare few cases, this could cause some subtle
|
|
side-effects (such as dependence on the exact contents of $0 or
|
|
__FILE__) and the optimization can be disabled by enabling the
|
|
disable_exec_load setting.
|
|
|
|
Shelling out
|
|
Any Ruby code that opens a subshell (like system, backticks, or %x{})
|
|
will automatically use the current Bundler environment. If you need to
|
|
shell out to a Ruby command that is not part of your current bundle,
|
|
use the with_clean_env method with a block. Any subshells created
|
|
inside the block will be given the environment present before Bundler
|
|
was activated. For example, Homebrew commands run Ruby, but don't work
|
|
inside a bundle:
|
|
|
|
|
|
|
|
Bundler.with_clean_env do
|
|
`brew install wget`
|
|
end
|
|
|
|
|
|
|
|
Using with_clean_env is also necessary if you are shelling out to a
|
|
different bundle. Any Bundler commands run in a subshell will inherit
|
|
the current Gemfile, so commands that need to run in the context of a
|
|
different bundle also need to use with_clean_env.
|
|
|
|
|
|
|
|
Bundler.with_clean_env do
|
|
Dir.chdir "/other/bundler/project" do
|
|
`bundle exec ./script`
|
|
end
|
|
end
|
|
|
|
|
|
|
|
Bundler provides convenience helpers that wrap system and exec, and
|
|
they can be used like this:
|
|
|
|
|
|
|
|
Bundler.clean_system('brew install wget')
|
|
Bundler.clean_exec('brew install wget')
|
|
|
|
|
|
|
|
RUBYGEMS PLUGINS
|
|
At present, the Rubygems plugin system requires all files named
|
|
rubygems_plugin.rb on the load path of any installed gem when any Ruby
|
|
code requires rubygems.rb. This includes executables installed into the
|
|
system, like rails, rackup, and rspec.
|
|
|
|
Since Rubygems plugins can contain arbitrary Ruby code, they commonly
|
|
end up activating themselves or their dependencies.
|
|
|
|
For instance, the gemcutter 0.5 gem depended on json_pure. If you had
|
|
that version of gemcutter installed (even if you also had a newer
|
|
version without this problem), Rubygems would activate gemcutter 0.5
|
|
and json_pure <latest>.
|
|
|
|
If your Gemfile(5) also contained json_pure (or a gem with a dependency
|
|
on json_pure), the latest version on your system might conflict with
|
|
the version in your Gemfile(5), or the snapshot version in your
|
|
Gemfile.lock.
|
|
|
|
If this happens, bundler will say:
|
|
|
|
|
|
|
|
You have already activated json_pure 1.4.6 but your Gemfile
|
|
requires json_pure 1.4.3. Consider using bundle exec.
|
|
|
|
|
|
|
|
In this situation, you almost certainly want to remove the underlying
|
|
gem with the problematic gem plugin. In general, the authors of these
|
|
plugins (in this case, the gemcutter gem) have released newer versions
|
|
that are more careful in their plugins.
|
|
|
|
You can find a list of all the gems containing gem plugins by running
|
|
|
|
|
|
|
|
ruby -rrubygems -e "puts Gem.find_files('rubygems_plugin.rb')"
|
|
|
|
|
|
|
|
At the very least, you should remove all but the newest version of each
|
|
gem plugin, and also remove all gem plugins that you aren't using (gem
|
|
uninstall gem_name).
|
|
|
|
|
|
|
|
June 2020 BUNDLE-EXEC(1)
|