做这些事情做到完全一样?
- 开始用红宝石过程
bundle exec ruby foo.rb
- 具有
require "bundler/setup"
作为第一行foo.rb
做这些事情做到完全一样?
bundle exec ruby foo.rb
require "bundler/setup"
作为第一行foo.rb
在您的具体的例子,他们可以被认为是相同的,但在现实中,他们是不一样的。
bundle exec
做一些改变环境, bundler/setup
不作。 如果您foo.rb
从未运行的子shell,或者从来没有试图在子shell运行其他红宝石可执行文件,那么这两个版本是等价的(他们都将正确加载捆绑宝石和工作完全一样)。
与整体思路bundle exec
是让你运行 最初设计时考虑到捆绑 , 不是 可执行文件 。 像rspec
, rails
, rackup
。 如果你自己的应用程序( foo.rb
)不尝试运行可执行文件等,可能是依赖于你的包,然后没有区别两种方式。 既然你要确保与捆绑器,你加载正确的宝石,并为bundler/setup
工程完全按照预期在您的案件。
从捆绑文档谈论运行红宝石系统可执行文件时:
在某些情况下,不捆绑EXEC运行可执行文件可以正常工作,如果可执行恰好被安装在你的系统在任何宝石,以你的包冲突不拉。
然而,这是不可靠的,是相当痛苦的根源。 即使它看起来像它的工作原理,它可能不会在未来或另一台机器上运行。
然后从包EXEC的手册页 ,你可以得到一些额外的线索,有的bundle exec
实际上做:
环境MODIFICATIONS
- 确保它仍然可以掏出(使用$ BUNDLE_BIN_PATH)由束EXEC调用的命令里捆绑
- 把含有可执行文件的目录(如导轨,RSpec的,rackup)为您的包在$ PATH
- 确保如果捆绑在子shell调用,它使用相同的Gemfile(通过设置BUNDLE_GEMFILE)
- 添加-rbundler /设置到$ RUBYOPT,这可以确保在子shell调用Ruby程序可以看到宝石的包
所以,如果你建立时考虑捆绑支持你的应用程序,那么你永远不需要bundle exec
您的应用程序。
但是,如果你需要它们加载你的应用程序代码(然后可能会拉一个错误的非绑定的宝石) 之前使用其他工具来加载您的应用程序代码可能会加载的宝石,那么你需要使用bundle exec
。