Ruby 2.7.2使用2.7.0库

kuhbmx9i  于 2023-05-06  发布在  Ruby
关注(0)|答案(3)|浏览(150)

我使用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版本的库?

d5vmydt9

d5vmydt91#

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的FAQ中有解释
在Ruby 2.x中,这个方案得到了进一步的改进。除非有严格的破坏性更改(目前还没有),否则所有次要版本都使用其第一个点版本的库版本。因此,所有Ruby 2.1.x版本都使用2.1.0,所有Ruby 2.7.x版本都使用2.7.0,以此类推。
因此,虽然你绝对不应该混合使用多个ruby版本的标准库,但lib目录中的库版本号在不同的版本中保持不变。例如,这允许在更新Ruby版本时为某个次要版本保留已安装的gem。
因此,您的webrick库的版本是您想要的版本。在Ruby版本中,Ruby团队只对webrick库进行了backported修复,而不是对整个库进行升级。

fzsnzjdm

fzsnzjdm2#

除了已接受的答案read the vulnerability notes carefully之外:
请将webrick gem更新到1.6.1或更高版本。你可以使用gem update webrick来更新它。如果您使用的是bundler,请将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

9jyewag0

9jyewag03#

我想知道的是,为什么我的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开始,也许更早。

相关问题