旧的gems总是适用于更高版本的ruby吗?

旧的gems总是适用于更高版本的ruby吗?,ruby,rubygems,Ruby,Rubygems,我使用的是ruby(2.5.1)的最新版本,但有一些旧的gems。我有一些问题。我想知道,有些gem只适用于特定版本的ruby,对吗 如果一个gem与ruby 2.3.0配合使用,那么它是否一定会与2.5.1配合使用(也就是说,因为2.5.1>2.3.0)?还是不总是这样 我想我要问的是,新的ruby版本是否总是与旧的gems向后兼容 Gem只是一个用Ruby编写的插件库 当然,Ruby正在开发中,新功能正在出现,旧功能正在消失 最好在.gempec文件中指定Ruby版本。例如 但如果没有,则必

我使用的是ruby(2.5.1)的最新版本,但有一些旧的gems。我有一些问题。我想知道,有些gem只适用于特定版本的ruby,对吗

如果一个gem与ruby 2.3.0配合使用,那么它是否一定会与2.5.1配合使用(也就是说,因为2.5.1>2.3.0)?还是不总是这样


我想我要问的是,新的ruby版本是否总是与旧的gems向后兼容

Gem只是一个用Ruby编写的插件库

当然,Ruby正在开发中,新功能正在出现,旧功能正在消失

最好在
.gempec
文件中指定Ruby版本。例如

但如果没有,则必须手动检查性能。因此,您可以阅读gem源代码或尝试使用gem并检查它


当然,为了实现自动化,最好使用测试。

Gem只是一个用Ruby编写的插件库

当然,Ruby正在开发中,新功能正在出现,旧功能正在消失

最好在
.gempec
文件中指定Ruby版本。例如

但如果没有,则必须手动检查性能。因此,您可以阅读gem源代码或尝试使用gem并检查它

当然,对于自动化,最好使用测试

如果一个gem与ruby 2.3.0一起工作,那么它确实会工作吗 使用2.5.1

这是不对的。编程语言在不断发展。这意味着语言维护人员正在进行大量的改进或重构,以增加新功能或从语言中删除旧组件。当语言社区宣布新特性或删除ruby中的旧特性(如
Fixnum
)时,开发人员应该按照说明相应地重构他们的代码库。换句话说,开发人员应该有一个良好的测试覆盖率来检测任何失败并立即修复

在您的场景中,我知道您没有测试覆盖率。唯一但简单的一件事就是将gems的版本升级到最新版本

如果一个gem与ruby 2.3.0一起工作,那么它确实会工作吗 使用2.5.1

这是不对的。编程语言在不断发展。这意味着语言维护人员正在进行大量的改进或重构,以增加新功能或从语言中删除旧组件。当语言社区宣布新特性或删除ruby中的旧特性(如
Fixnum
)时,开发人员应该按照说明相应地重构他们的代码库。换句话说,开发人员应该有一个良好的测试覆盖率来检测任何失败并立即修复

在您的场景中,我知道您没有测试覆盖率。唯一但简单的一件事就是将gems的版本升级到最新版本

版本政策一直认为
MINOR
版本的更改可能会引入破坏API的更改

如果任何gem使用的API发生了变化,就会出现不兼容

MINOR
版本号在
2.3.*
2.5.*
之间已经更改了两次,因此,即使一个gem恰好是按照文档化的API编写的,也不能保证它会继续工作,除非gem的维护人员努力测试gem(并在必要时进行升级)。自动化测试套件帮助很大

记录实际测试的版本兼容性的标准方法是

有趣的是,如果一个特定的gem写得很糟糕,我想它可能会在Ruby的兼容版本之间实现收支平衡。这不是我在Ruby生态系统中遇到过的事情,但我曾经遇到过(Java以其向后兼容性而闻名)我自己的代码意外地使用了一个不属于API的类。有很多宝石。谁知道会有什么呢?:)

版本策略一直是
次要版本的更改可能会引入破坏API的更改

如果任何gem使用的API发生了变化,就会出现不兼容

MINOR
版本号在
2.3.*
2.5.*
之间已经更改了两次,因此,即使一个gem恰好是按照文档化的API编写的,也不能保证它会继续工作,除非gem的维护人员努力测试gem(并在必要时进行升级)。自动化测试套件帮助很大

记录实际测试的版本兼容性的标准方法是


有趣的是,如果一个特定的gem写得很糟糕,我想它可能会在Ruby的兼容版本之间实现收支平衡。这不是我在Ruby生态系统中遇到过的事情,但我曾经遇到过(Java以其向后兼容性而闻名)我自己的代码意外地使用了一个不属于API的类。有很多宝石。谁知道那里有什么?:)

很可能,但不一定。最近最生动的例子是
Range#cover?
,它改变了2.6中的行为。另一个例子可能是,依赖于
Bignum
Fixnum
的gems自Ruby 2.4以来显示了一个警告,因为这些类已被弃用,您应该改用
Integer
。这只是一个时间问题,直到这些类完全从Ruby中删除,然后依赖它们的旧gem不仅会发出警告,而且会失败。根据我的经验,对于任何语言来说,答案都是否定的。变化是恒定的,熵也是恒定的。很可能,但不一定。最近最生动的例子是
Range#cover?
,它改变了2.6中的行为。另一个例子可能是gems根据
Bignum
Fixnum
显示一个警告