gpt4 book ai didi

ruby-on-rails - Ruby\Rubygems 他们如何决定加载哪些 gem ?

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:59 26 4
gpt4 key购买 nike

这是比较好奇的问题,不是问题。当系统上存在多个版本时,使用 require 命令时会选择哪些版本?故事背景是:我正在项目(不是 Rails 项目)中实现 bundler gem。我没有问题,但其他开发人员有问题,经过快速调查后我意识到我没有使用

require "bundler/setup"

这基本上加载了捆绑的 gem 。快速修复,但它让我想知道 ruby​​ 如何通过 ruby​​gems 决定使用哪些 gem 。由于代码中断是因为 Ruby 应用程序使用了其中一个 gem 的旧版本,而不是新版本。这意味着它不使用“最新”的 gem,那么它背后的逻辑是什么?

更新

为了进一步解释这个问题,假设你有 gems foo-1.0.1foo-1.0.2 当你说 require 'foo' ruby​​ 如何知道加载哪一个?

最佳答案

在 Ruby 中你 require 文件 而不是gem。如果在当前加载路径上找不到该文件,Rubygems 将在已安装的 gem 中搜索具有该名称的文件,如果找到一个,则 gem 被激活(意味着它被添加到laod 路径),然后需要该文件。通常,gem 的 lib 中会有一个同名文件。目录。一个 gem 只能激活一个版本。

激活的 gem 是可用的最新版本,与任何其他激活的 gem 兼容。通常这只意味着安装的最新版本将被激活,但如果您已经激活了一些声明依赖于您尝试激活的 gem 的早期版本的 gem,则情况可能并非如此。

例如,如果您有 foo-1.0.1foo-1.0.2安装,然后 require 'foo' (假设他们的 foo.rb 目录中有一个名为 lib 的文件,而其他 gem 没有)将导致版本 1.0.2 被激活。但是,如果您也有 gem bar它依赖于 1.0.1然后调用require 'foo'bar 之后已激活将导致 1.0.1 of foo被激活。

此外,如果您尝试以其他顺序要求它们,require 'foo'; require 'bar';然后你会得到类似的东西

Gem::LoadError: Unable to activate bar-1, because foo-2 conflicts with foo (= 1)

这里不能激活bar , 这取决于 foo 的 1.0.1 版因为您已经激活了 foo 的 1.0.2 版.

关于ruby-on-rails - Ruby\Rubygems 他们如何决定加载哪些 gem ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829592/

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