检查宝石的兼容Ruby版本的真实方法是什么

时间:2019-01-06 12:06:54

标签: ruby rubygems gemspecs

我想知道如何确定特定的宝石是否与特定的红宝石版本兼容。 我想升级正在处理的应用程序的Ruby版本。但是我没有看到一种了解特定宝石支持哪种红宝石版本的真实方法。

我首先找到了宝石的*.gemspec,该宝石经常(不是总是)包含一个配置config.required_ruby_version ... 但是我注意到并不是所有的gems都包含一个gemspec文件,例如,我注意到我的系统(activerecord)上有一些gems,但缺少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

这里是link to the Activerecord repository,下面是截屏,其中非常包含一个gemspec文件 enter image description here

3 个答案:

答案 0 :(得分:1)

查找gemspec文件和rubygems是检查ruby兼容的好方法,但是如上所述,如果gem作者不编写gemspec文件,这将毫无用处。

如果您使用rvmrbenv之类的红宝石版本管理系统,则编写简单的测试脚本将是一个解决方案。如果您的本地计算机上已经安装了Ruby版本2.4.12.5.1,请按如下所示编写test script

#!/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将选择一个红宝石版本,并对选定的红宝石版本进行测试。

如果gem没有任何单元测试,则该测试脚本也将无用。但是没有任何单元测试的gem不值得使用。

尽管如此,该解决方案也不是检查兼容红宝石版本的可靠方法,值得您进行测试。

答案 1 :(得分:0)

我建议您查看宝石的rubygems page。在左栏中,您将找到所需的Ruby版本。对于activerecord,您至少需要Ruby >= 1.9.3

但是请记住,这仅告诉您最低版本号。因为在发布特定版本时,开发人员无法确定将来某个特定版本的Ruby是否可能带来重大更改。

对于受支持的最高版本,您必须调查发行说明或问题。在您的示例中,您将找到article,Rails 4.2.8添加了对Ruby 2.4的支持。因此,我猜想Rails 4.2.7仅支持Ruby 2.3。

答案 2 :(得分: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 documentation: https://guides.rubygems.org/rubygems-org-api-v2/