这些事情完成得完全一样吗?
使用bundle exec ruby foo.rb
启动ruby进程
以require "bundler/setup"
作为foo.rb
的第一行
最佳答案
在您的具体例子中,它们可以被认为是相同的,但实际上它们并不相同。bundle exec
对环境做了一些bundler/setup
没有做的更改。如果您的foo.rb
从未运行过子shell,或者从未尝试在子shell中运行其他ruby可执行文件,那么这两个版本都是等效的(它们都将正确加载绑定gem,并且工作完全相同)。bundle exec
的全部思想是让您能够运行最初设计时没有考虑bundler的可执行文件。像rspec
,rails
,rackup
。如果您自己的应用程序(foo.rb
)不尝试运行可能依赖于您的捆绑包的可执行文件,那么这两种方式都没有区别。因为bundler只需要确保加载了正确的gems,因此bundler/setup
在您的案例中完全按照预期工作。
当谈到运行ruby系统可执行文件时:
在某些情况下,如果可执行文件恰好安装在您的系统中,并且没有引入任何与包冲突的gem,则运行不带bundle exec的可执行文件可能会工作。
然而,这是不可靠的,是相当痛苦的根源。即使它看起来像在工作,但它可能在未来或在另一台机器上不工作。
然后从bundler docs中,您可以获得一些关于bundle exec
实际作用的额外线索:
环境修改
确保仍然可以从bundle exec调用的命令内部(使用$bundle_bin_path)解包到bundle
将包含包的可执行文件(如rails、rspec、rackup)的目录放在$path上
确保在子shell中调用bundler时,它使用相同的gemfile(通过设置bundle gemfile)
在$rubyopt中添加-rbundler/setup,确保在子shell中调用的ruby程序可以看到包中的gems
因此,如果您在构建应用程序时考虑到了bundler支持,那么您永远不需要bundle exec
您的应用程序。
但是如果你需要使用其他工具加载你的应用程序代码,这些工具可能在加载你的应用程序代码之前加载gem(然后可能会拉入错误的非绑定gem),那么你需要使用bundle exec
。
关于ruby - bundle 执行程序是否需要和“bundle/设置”等效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11117112/