gpt4 book ai didi

ruby - bundle exec 和 require 'bundler/setup' 是否等效?

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:39 25 4
gpt4 key购买 nike

这些事情完成的是否完全相同?

  • 使用 bundle exec ruby​​ foo.rb 启动 ruby​​ 进程
  • require "bundler/setup" 作为 foo.rb 的第一行

最佳答案

在您的特定示例中,它们可以被认为是相同的,但实际上它们并不相同。

bundle execbundler/setup 没有进行的环境进行了一些更改。如果您的 foo.rb 从不运行子 shell,或者从不尝试在子 shell 中运行其他 ruby​​ 可执行文件,那么这两个版本是等效的(它们都将正确加载 bundle 的 gem 并且工作完全相同)。

bundle exec 的整个想法是让您能够运行可执行文件 最初设计时并未考虑 bundle 程序。像 rspecrailsrackup。如果您自己的应用程序 (foo.rb) 不尝试运行可能依赖于您的 bundle 的此类可执行文件,那么这两种方式都没有区别。由于您要确保使用 bundler 的只是加载正确的 gem,因此 bundler/setup 完全按照您的情况进行操作。

来自bundler docs在谈论运行 ruby​​ 系统可执行文件时:

In some cases, running executables without bundle exec may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle.

However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine.

然后从manpage of bundle exec您可以获得一些关于 bundle exec 实际作用的额外线索:

ENVIRONMENT MODIFICATIONS

  • make sure that it's still possible to shell out to bundle from inside a command invoked by bundle exec (using $BUNDLE_BIN_PATH)
  • put the directory containing executables (like rails, rspec, rackup) for your bundle on $PATH
  • make sure that if bundler is invoked in the subshell, it uses the same Gemfile (by setting BUNDLE_GEMFILE)
  • add -rbundler/setup to $RUBYOPT, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle

因此,如果您在构建应用程序时考虑到 bundler 支持,那么您永远不需要bundle exec您的应用程序。

但是,如果您需要使用其他工具来加载您的应用程序代码,这些工具可能会在加载您的应用程序代码之前加载您的应用程序代码(然后可能会引入错误的非- bundled gem),那么你需要使用 bundle exec

关于ruby - bundle exec 和 require 'bundler/setup' 是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com