我使用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版本的库?
3条答案
按热度按时间d5vmydt91#
lib
目录中的版本化目录,即示例中的2.6.0
并不表示库文件所属的确切Ruby,而是表示“库兼容版本”。在过去,即使是小版本也有很大的不同,你有像
1.8.6
或1.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修复,而不是对整个库进行升级。
fzsnzjdm2#
除了已接受的答案read the vulnerability notes carefully之外:
请将webrick gem更新到
1.6.1
或更高版本。你可以使用gem update webrick来更新它。如果您使用的是bundler,请将gem "webrick", ">= 1.6.1"
添加到您的Gemfile。受影响的版本
1.6.0
或更早版本2.7.1
或更早版本的webrick捆绑版本你没有使用webrick gem。您使用的是捆绑版本。
您机器上的宝石将位于:
但是你的
webrick
库在:安全修复was applied to the ruby
2.7.2
bundled version。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开始,也许更早。