这些事情完成得完全一样吗?
使用bundle exec ruby foo.rb启动ruby进程
require "bundler/setup"作为foo.rb的第一行

最佳答案

在您的具体例子中,它们可以被认为是相同的,但实际上它们并不相同。
bundle exec对环境做了一些bundler/setup没有做的更改。如果您的foo.rb从未运行过子shell,或者从未尝试在子shell中运行其他ruby可执行文件,那么这两个版本都是等效的(它们都将正确加载绑定gem,并且工作完全相同)。
bundle exec的全部思想是让您能够运行最初设计时没有考虑bundler的可执行文件。像rspecrailsrackup。如果您自己的应用程序(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/

10-13 09:24