这些事情是否完全一样?
- 开始一个红宝石进程
bundle exec ruby foo.rb
- 作为
require "bundler/setup"
第一行foo.rb
在您的具体示例中,它们可以被认为是相同的,但实际上它们并不相同。
bundle exec
bundler/setup
对不做的环境做出一些改变。如果您foo.rb
从不运行子 shell,或者从不尝试在子shell 中运行其他 ruby 可执行文件,那么这两个版本是等效的(它们都将正确加载捆绑的 gem 并且工作完全相同)。
整个想法bundle exec
是使您能够运行最初设计时没有考虑到捆绑器的可执行文件。像rspec
, rails
, rackup
. 如果您自己的应用foo.rb
(因为您要确保使用 bundler 只是加载正确的 gem,并且bundler/setup
在您的情况下完全按照预期工作。
在谈到运行 ruby 系统可执行文件时,来自bundler 文档:
在某些情况下,如果可执行文件恰好安装在您的系统中并且没有拉入任何与您的捆绑包冲突的 gem,则在没有 bundle exec 的情况下运行可执行文件可能会起作用。
然而,这是不可靠的并且是相当大的痛苦的来源。即使它看起来可以正常工作,但将来或在另一台机器上可能无法正常工作。
然后从bundle exec 的联机帮助页中,您可以获得一些关于bundle exec
实际操作的额外线索:
环境修改
- 确保仍然可以从 bundle exec 调用的命令内部进行打包(使用 $BUNDLE_BIN_PATH)
- 将包含可执行文件(如 rails、rspec、rackup)的目录放在 $PATH 上
- 确保如果在子 shell 中调用 bundler,它使用相同的 Gemfile(通过设置 BUNDLE_GEMFILE)
- 将 -rbundler/setup 添加到 $RUBYOPT,确保在子 shell 中调用的 Ruby 程序可以看到包中的 gem
因此,如果您在构建应用时考虑到捆绑器支持,那么您永远不需要bundle exec
您的应用。
但是,如果您需要使用其他工具来加载您的应用程序代码,这些工具可能会在加载您的应用程序代码之前加载 gem (这可能会拉入错误的非捆绑 gem),那么您需要使用bundle exec
.