微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据日期或 Ruby 版本设置 Ruby 环境

如何解决根据日期或 Ruby 版本设置 Ruby 环境

出于测试目的,我想根据过去的日期安装一个 Ruby 环境。例如,Ruby 2.5.0p0 于 2017 年 12 月 25 日发布,我在某处读到 Rails 5.2.6 是与它一起使用的版本。我想要的是一种编程方式来知道 gem 的哪个版本/日期应该与什么版本的 Ruby 搭配。我是否错过了一些非常简单的方法来做到这一点?

编辑:

我在某个特定日期存在的 Ruby 环境中进行测试的想法似乎难以处理,而且可能是不必要的。所以我要做的是运行几个主要的 Ruby 版本并安装它们的 best Rails versions,然后让所有其他 gem 浮动到任何被拖入的版本中。

Ruby    Rails
2.5.0   5.2.6
2.5.9   5.2.6
2.6.7   6.0.3.7
2.7.3   6.0.3.7
3.0.1   latest

解决方法

Rails 和所有其他 gem 可以说明所需的最低 ruby​​ 版本。运行 bundle update 时会自动考虑这一点。

但是,有两个问题:

  1. 库作者不会总是完美地做到这一点 -- 因此,您可能会使用古老的 ruby​​ 版本运行现代 gem,并且只在运行时发现不兼容。

  2. 图书馆作者无法预测未来;他们可能会正确指定最低所需的 ruby​​ 版本,但他们不可能提前知道最大兼容的 ruby​​ 版本。

然而,有一线希望:Ruby 非常擅长向后兼容。因此,除非您尝试使用古老的库和现代 ruby​​ 运行一个大项目(例如使用 ruby​​ 2.7 的 rails 4 项目),否则您在这里不太可能遇到太多问题。

而且,正如我上面所建议的,这可能只是大型 gems 的问题,例如 rails 框架。 It's fairly well documented which minimum version of ruby is supported by each major rails release

Rails 7 需要 Ruby 2.7.0 或更新版本。

Rails 6 需要 Ruby 2.5.0 或更新版本。

Rails 5 需要 Ruby 2.2.2 或更新版本。

,

我想要的是一种知道 gem 的版本/日期的编程方式 应该使用什么版本的 Ruby。

这样做的一种方法是使用 the API provided by RubyGems.org

# run with ruby get_versions.rb gemname rubyversion

require 'json'
require 'uri'
require 'net/http'
require 'pp'

gemname = ARGV[0] || 'rails'
uri = URI("https://rubygems.org/api/v1/versions/#{gemname}.json")
target_ruby_version = Gem::Version.new(ARGV[1] || '2.7.0')

puts "getting #{uri}"

response = Net::HTTP.start(uri.host,uri.port,use_ssl: true) do |http|
  puts '...'
  request = Net::HTTP::Get.new uri
  http.request(request)
end
# error handling is boring so lets just assume this will always work
json = JSON.parse(response.body)
compatible = json.each_with_object({}) do |gem_version,hash|
  hash[gem_version["number"]] = gem_version["ruby_version"]
end.select do |gemv,rubyv|
  Gem::Requirement.new(rubyv)
                  .satisfied_by?(target_ruby_version)
end

puts "The following versions of #{gemname} satifisy the Ruby requirement #{target_ruby_version}:"

pp compatible.keys

然而,它在测试 gem 是否真的与给定版本的 Ruby 兼容时的实际用途是非常值得怀疑的。由于作者通常不指定 ruby​​ 版本的范围,它只是告诉您给定的 Ruby 版本是否满足最低版本要求。汤姆·罗德 (Tom Lord) 在描述为什么会出现问题方面做得非常出色。

您在 Ruby 2.7.0 上运行 Rails 0.8.0 的体验可能会有所不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。