【问题标题】:Do old gems always work on later versions of ruby?旧宝石是否总是适用于更高版本的 ruby​​?
【发布时间】:2019-02-16 12:06:33
【问题描述】:

我使用的是最新版本的 ruby​​ (2.5.1),但有一些旧的 gem。我有一些问题。我想知道,某些宝石仅适用于某些版本的红宝石是否正确?

如果 gem 与 ruby​​ 2.3.0 一起使用,它是否会一定与 2.5.1 一起使用(即因为 2.5.1 > 2.3.0)?或者情况并非总是如此?

我想我要问的是新的 ruby​​ 版本是否总是向后兼容旧的 gem?

【问题讨论】:

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

标签: ruby rubygems


【解决方案1】:

如果一个 gem 与 ruby​​ 2.3.0 一起工作,它是真的吗? 使用 2.5.1

这是不正确的。编程语言在发展的同时也在发展。这意味着语言维护者正在做很多改进或重构它们是新功能或从语言中删除旧组件。当语言社区宣布新功能或删除旧功能(如 ruby​​ 中的Fixnum)时,开发人员应遵循说明并相应地重构他们的代码库。换句话说,开发人员应该有良好的测试覆盖率来检测任何失败并立即修复它。

在您的场景中,据我所知,您没有测试覆盖率。应该做的唯一但简单的事情就是将您的 gem 版本升级到最新版本。

【讨论】:

    【解决方案2】:

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

    当然,Ruby 正在发展,新功能正在出现,旧功能正在消失。

    最好在 .gemspec 文件中指定 Ruby 版本。例如,like this one

    但如果不是,那么您必须手动检查性能。因此,您可以阅读 gem 源代码或尝试使用您的 gem 并检查它。

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

    【讨论】:

      【解决方案3】:

      Starting at Ruby 2.1.0 的版本政策一直是 MINOR 版本的更改可能会引入 API 重大更改。

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

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

      记录实际测试的版本兼容性的标准方法是by providing required_ruby_version in .gemspec files

      有趣的是,如果一个特定的 gem 写得很糟糕,我想它可能会在兼容的 Ruby 版本之间达到平衡。这不是我在 Ruby 生态系统中遇到的问题,但我遇到了 made a similar mistake writing Java code(Java 以其向后兼容性而闻名),我自己的代码意外使用了一个不属于 API 的类。有很多宝石。谁知道外面有什么? :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        相关资源
        最近更新 更多