【问题标题】:Ruby 2.7.2 uses 2.7.0 librariesRuby 2.7.2 使用 2.7.0 库
【发布时间】:2021-10-08 23:37:52
【问题描述】:

我使用 rbenv 安装了 Ruby 2.7.2,但是当我运行以下代码时:

require 'webrick'

WEBrick::VERSION
=> "1.6.0"
WEBrick::HTTPUtils.method(:mime_type).source_location
=> ["/Users/my_user/.rbenv/versions/2.7.2/lib/ruby/2.7.0/webrick/httputils.rb", 133]

我有 webrick 1.6 版,它有一个 security issue,在 ruby 2.7.2 中打了补丁。

如果我们在 ruby​​ 2.7.2 中使用 docker 映像,这也会发生在我们的开发/生产环境中,所以,我认为这不是 rbenv 问题。

我想知道的是,为什么我的 ruby​​ 解释器使用 2.7.0 版本的库?

【问题讨论】:

    标签: ruby-on-rails ruby rubygems bundler


    【解决方案1】:

    lib 目录中的版本化目录,即您的示例中的 2.6.0 并不表示库文件所属的确切 Ruby,而是表示“库兼容版本”。

    在过去,即使是小版本也有很大的不同,你会有1.8.61.8.7 之类的目录,因为这些Ruby 版本彼此之间有很大的不同。然而,他们的补丁版本足够兼容,安装的 gem 应该在该版本范围内兼容。

    在 Ruby 1.9.x 版本中,情况好坏参半。 Ruby 1.9.0 和 1.9.1 都有各自的版本目录。 Ruby 1.9.2 和 1.9.3 声称与 Ruby 1.9.1 库兼容,因此继续使用1.9.1 目录。这在 Ruby 1.9.2 的 the release announcement 中的常见问题解答中进行了解释

    在 Ruby 2.x 中,该方案得到了进一步完善。除非有严格的重大更改(其中还没有),所有次要版本都使用其第一个点版本的库版本。因此所有 Ruby 2.1.x 版本都使用2.1.0,所有 Ruby 2.7.x 版本都使用2.7.0 等等。

    因此,虽然您绝对不应该混合多个 ruby​​ 版本的标准库,但 lib 目录中的库版本号在不同的版本中保持相同。例如,这允许在更新 Ruby 版本时为某个次要版本保留已安装的 gem。

    因此,您的 webrick 库的版本就是您想要的版本。在 Ruby 版本中,Ruby 团队刚刚backported 修复了 webrick 库,而不是碰撞 while 库。

    【讨论】:

      【解决方案2】:

      进一步接受的答案,read the vulnerability notes carefully

      请将 webrick gem 更新到版本 1.6.1 或更高版本。您可以使用 gem update webrick 来更新它。如果您使用捆绑器,请添加 gem "webrick", ">= 1.6.1" 到您的 Gemfile。

      受影响的版本

      • webrick gem 1.6.0 或之前
      • ruby 2.7.1 或之前版本的 webrick 捆绑版本

      没有使用 webrick gem。您使用的是捆绑版

      您机器上的宝石将位于:

      /Users/my_user/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/...
      

      但是您的 webrick 库位于:

      /Users/my_user/.rbenv/versions/2.7.2/lib/ruby/2.7.0/...
      

      安全修复was applied to the ruby 2.7.2 bundled version

      【讨论】:

        【解决方案3】:

        我想知道的是,为什么我的 ruby​​ 解释器使用 2.7.0 版本的库?

        /Users/my_user/.rbenv/versions/2.7.2/lib/ruby/2.7.0/webrick/httputils.rb

        这是一个常见的混淆来源。这就是红宝石的工作原理。

        • 如果您查看内部,例如.rbenv/versions/2.6.3 你会找到2.6.3/lib/ruby/2.6.0
        • 如果您查看内部,例如.rbenv/versions/3.0.2 你会找到2.6.3/lib/ruby/3.0.0

        这种目录结构已经存在了很长时间,至少从 1.9.3 开始,可能更早。

        【讨论】:

        • 但是为什么我有一个旧版本的 webrick 1.6,即使 2.7.2 的更新日志说它已经更新了?
        猜你喜欢
        • 2023-03-21
        • 2020-06-06
        • 1970-01-01
        • 2020-04-16
        • 2020-06-24
        • 2021-07-12
        • 1970-01-01
        • 2021-08-18
        • 2021-05-12
        相关资源
        最近更新 更多