是捆绑Exec和要求“打捆/设置”等同?(Are bundle exec and require &

2019-07-30 01:08发布

做这些事情做到完全一样?

  • 开始用红宝石过程bundle exec ruby foo.rb
  • 具有require "bundler/setup"作为第一行foo.rb

Answer 1:

在您的具体的例子,他们可以被认为是相同的,但在现实中,他们是不一样的。

bundle exec做一些改变环境, bundler/setup不作。 如果您foo.rb从未运行的子shell,或者从来没有试图在子shell运行其他红宝石可执行文件,那么这两个版本是等价的(他们都将正确加载捆绑宝石和工作完全一样)。

与整体思路bundle exec是让你运行 最初设计时考虑到捆绑不是 可执行文件 。 像rspecrailsrackup 。 如果你自己的应用程序( 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



文章来源: Are bundle exec and require 'bundler/setup' equivalent?
标签: ruby bundler