【问题标题】:Why does require choose the latest version of a gem?为什么需要选择最新版本的gem?
【发布时间】:2018-05-05 17:17:47
【问题描述】:

如果我加载一个 gem,假设 activerecord,在 IRB 中 require 选择最新版本的 activerecord。以编程方式,是什么影响了选择最新 gem 版本的决定? require 是这样做的,还是在加载的 IRB 中强制要求选择最新版本?

这是我通过 bundler 安装的 activerecord gem:

➜  ~ ls -al /Users/robskrob/.rvm/gems/ruby-2.4.1/gems/activere
activerecord-4.2.10/   activerecord-5.0.0.1/  activerecord-5.1.2/    activerecord-5.1.3/    activerecord-5.1.4/    activerecord-5.1.5/    activerecord-5.1.6/    activeresource-5.0.0/

这是一个示例 IRB 会话:

➜  ~ irb
2.4.1 :001 > require 'active_record'
 => true
2.4.1 :002 > Gem.loaded_specs['activerecord'].version
 => #<Gem::Version "5.1.6">
2.4.1 :003 >

【问题讨论】:

    标签: ruby activerecord rubygems bundler


    【解决方案1】:

    如果我加载一个 gem,假设 activerecord,在 IRB 中 require 选择最新版本的 activerecord

    其实是选择最新版that doesn't conflict with any already activated gem

    以编程方式,是什么影响了选择最新 gem 版本的决定? require 是在这样做,还是在加载的 IRB 中强制要求选择最新版本?

    这是requires 的工作。更具体地说,这是the monkey-patched require from the RubyGems library 的工作,而不是the original require from the Ruby core library

    这只是简单的关注点分离:IRb 是一个 REPL,而不是包管理系统,它不应该了解任何关于包的信息。

    【讨论】:

    • 非常感谢您的回答。请原谅我的无知——也许这应该是一个单独的 SO 帖子——但为什么 IRB 会话使用来自 RubyGems 中猴子补丁版本的require 而不使用来自 Ruby 核心库的require
    • 这与 IRb 无关。 Ruby 1.9 之后的版本会在启动时自动加载 RubyGems 库,除非通过 --disable-rubygems 明确禁用。 RubyGems 猴子补丁 Kernel#require 除了在 $LOAD_PATH 之外在 gems 中查找文件。非常旧的 RubyGems 版本没有这样做,您必须首先通过调用 Kernel#gem 来“激活”一个 gem(将其添加到 $LOAD_PATH)。 require 的 monkeypatched 版本将在所有已安装的 gem 中搜索该文件,如果找到它会为您激活一个 gem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多