如何解决根据日期或 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
时会自动考虑这一点。
但是,有两个问题:
-
库作者不会总是完美地做到这一点 -- 因此,您可能会使用古老的 ruby 版本运行现代 gem,并且只在运行时发现不兼容。
-
图书馆作者无法预测未来;他们可能会正确指定最低所需的 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 举报,一经查实,本站将立刻删除。