2

如何确定特定 gem 是否与某个 Ruby 版本兼容?

我想升级我正在开发的应用程序的 Ruby 版本,但我没有看到一种真正的方式来了解特定 gem 支持哪个 Ruby 版本。

我找到了*.gemspecgem,它通常包含一个配置config.required_ruby_version ...,但我注意到并非所有 gem 都包含 gemspec 文件。我注意到我的系统上有一些 gem,例如 ActiveRecord,它们缺少 Gemfile,而在 GitHub 上,我们有一个gemspec可用的文件。

这是ls -lrth我本地机器的输出:

Einstiens-MacBook-Pro:activerecord-4.2.7.1 superhero$ ls -lrth
total 128
-rw-r--r--  1 superhero  jingle    51K Dec 23 00:07 CHANGELOG.md
-rw-r--r--  1 superhero  jingle   1.0K Dec 23 00:07 MIT-LICENSE
-rw-r--r--  1 superhero  jingle   6.6K Dec 23 00:07 README.rdoc
drwxr-xr-x  4 superhero  jingle   128B Dec 23 00:07 examples
drwxr-xr-x  5 superhero  jingle   160B Dec 23 00:07 lib

ActiveRecord 存储库有一个gemspec文件: 在此处输入图像描述

4

3 回答 3

2

查找gemspec文件并检查RubyGems.org是检查 Ruby 兼容性的好方法,但如上所述,如果 gem 作者不编写gemspec文件,那将毫无用处。

如果您使用像 RVM 或 rbenv 这样的 Ruby 版本管理系统,那么制作一个简单的测试脚本将是一个解决方案。如果 Ruby 版本 2.4.1 和 2.5.1 已安装在本地计算机上,请编写类似于“使用多个 Ruby 和 Gem 版本进行测试”的脚本,例如:

#!/usr/bin/env bash

set -e

rubies=("ruby-2.4.1" "ruby-2.5.3")
for i in "${rubies[@]}"
do
  echo "====================================================="
  echo "$i: Start Test"
  echo "====================================================="
  rvm $i exec bundle
  rvm $i exec bundle exec rake test
  echo "====================================================="
  echo "$i: End Test"
  echo "====================================================="
done

RVM 将选择一个 Ruby 版本并针对选定的 Ruby 版本运行测试。

如果 gem 没有任何单元测试,那么这个测试脚本也将毫无用处。但是没有任何单元测试的 gem 不值得使用。

虽然,此解决方案也不是检查兼容 Ruby 版本的可靠方法,但值得用于您的测试。

于 2019-01-09T09:25:09.403 回答
0

我在 Rubygems.org 上发现了一些更有趣的东西,它作为 API 呈现关于 gem 的 JSON/XML 响应。

通常在 Rubygems.org 中提到它,但在gemspec有关 Ruby 版本兼容性的文件中没有提到。

这是获取它的一次性方法:

curl https://rubygems.org/api/v2/rubygems/activerecord/versions/4.2.7.1.json
{
  "name": "activerecord",
  "downloads": 163190934,
  "version": "4.2.7.1",
  "version_downloads": 6061660,
  "platform": "ruby",
  "authors": "David Heinemeier Hansson",
  "info": "Databases on Rails. Build a persistent domain model by mapping database tables to Ruby classes. Strong conventions for associations, validations, aggregations, migrations, and testing come baked-in.",
  "licenses": [
    "MIT"
  ],
  "metadata": {},
  "sha": "923a64e2ebb9c4529761bf65ed37601a7000af2f3b18f12ea00e9f9ba2a168d2",
  "project_uri": "https://rubygems.org/gems/activerecord",
  "gem_uri": "https://rubygems.org/gems/activerecord-4.2.7.1.gem",
  "homepage_uri": "http://rubyonrails.org",
  "wiki_uri": null,
  "documentation_uri": "http://www.rubydoc.info/gems/activerecord/4.2.7.1",
  "mailing_list_uri": null,
  "source_code_uri": null,
  "bug_tracker_uri": null,
  "changelog_uri": null,
  "dependencies": {
    "development": [],
    "runtime": [
      {
        "name": "activemodel",
        "requirements": "= 4.2.7.1"
      },
      {
        "name": "activesupport",
        "requirements": "= 4.2.7.1"
      },
      {
        "name": "arel",
        "requirements": "~> 6.0"
      }
    ]
  },
  "built_at": "2016-08-10T00:00:00.000Z",
  "created_at": "2016-08-11T17:33:45.486Z",
  "description": "Databases on Rails. Build a persistent domain model by mapping database tables to Ruby classes. Strong conventions for associations, validations, aggregations, migrations, and testing come baked-in.",
  "downloads_count": 6061660,
  "number": "4.2.7.1",
  "summary": "Object-relational mapper framework (part of Rails).",
  "rubygems_version": ">= 0",
  "ruby_version": ">= 1.9.3",
  "prerelease": false,
  "requirements": []
}

并提取ruby_version

有关详细信息,请参阅API 文档

于 2019-01-09T08:24:18.837 回答
0

我建议查看 gem 的RubyGems 页面。在左栏中,您将找到所需的 Ruby 版本。对于 ActiveRecord,您至少需要 Ruby >= 1.9.3

但请记住,这只告诉您最低版本号。因为在发布特定版本时,开发人员无法判断 Ruby 的某个未来版本是否会引入重大更改。

对于最大支持的版本,您必须调查发行说明或问题。在您的示例中,您会发现一篇文章“ This Week in Rails: Ruby 2.4 on Rails 4.2 ”,Rails 4.2.8 添加了对 Ruby 2.4 的支持。因此我猜 Rails 4.2.7 只支持 Ruby 2.3。

于 2019-01-06T14:24:02.720 回答