本项目支持 Ruby 2.7, 3.0, 3.1, 3.2 和 3.3。
本项目使用独立的 Gemfile 管理不同 Ruby 版本的依赖:
gemfiles/
├── Gemfile.ruby-2.7 # Ruby 2.7.x 专用
├── Gemfile.ruby-2.7.lock
├── Gemfile.ruby-3.0 # Ruby 3.0.x 专用
├── Gemfile.ruby-3.0.lock
├── Gemfile.ruby-3.1 # Ruby 3.1.x 专用
├── Gemfile.ruby-3.1.lock
└── README.md # 详细说明
为什么需要多个 Gemfile?
- flexmock: Ruby 2.7 使用 2.x,Ruby 3.0+ 使用 3.x
- nokogiri: 不同版本有不同的兼容性要求
- net-* gems: Ruby 3.1+ 需要显式声明
- 避免单一 Gemfile.lock 的版本冲突
详细说明请查看 gemfiles/README.md。
运行以下命令快速测试所有 Ruby 版本的基本兼容性:
./test_multi_ruby.sh此脚本会:
- 自动切换 Ruby 版本
- 自动选择对应的版本特定 Gemfile
- 安装所有依赖(包括开发依赖)
- 测试 gem 加载是否成功
- 运行完整测试套件
- 显示详细的测试结果
优点:
- ✅ 每个版本使用最优化的依赖
- ✅ 无版本冲突
- ✅ 可重现的构建
运行完整的测试套件(包含单元测试):
./test_multi_ruby_full.sh此脚本会:
- 安装所有依赖(包括开发依赖)
- 运行完整的测试套件
- 验证所有功能
注意:在 ARM Mac 上,旧版本 Ruby (2.7.6) 可能无法编译 nokogiri(jeweler 的依赖)。如果遇到编译问题,使用方法一即可。
使用版本特定的 Gemfile:
# 1. 切换到目标 Ruby 版本
rbenv local 3.1.7
# 2. 使用对应的 Gemfile 安装依赖
BUNDLE_GEMFILE=gemfiles/Gemfile.ruby-3.1 bundle install
# 3. 测试 gem 加载
ruby -I lib -e "require 'aws/ses'; puts 'Success with Ruby ' + RUBY_VERSION"
# 4. 运行测试
BUNDLE_GEMFILE=gemfiles/Gemfile.ruby-3.1 bundle exec rake test
# 5. 恢复默认 Ruby 版本
rbenv local --unset提示:可以设置环境变量避免重复输入:
export BUNDLE_GEMFILE=gemfiles/Gemfile.ruby-3.1
bundle install
bundle exec rake test如果缺少某些 Ruby 版本,可以使用以下命令安装:
rbenv install 2.7.6
rbenv install 3.0.7
rbenv install 3.1.7本项目配置了 GitHub Actions,会在以下情况自动运行测试:
- Push 到 master/main 分支
- 创建 Pull Request
GitHub Actions 会在以下 Ruby 版本上运行测试:
- Ruby 2.7
- Ruby 3.0
- Ruby 3.1
- Ruby 3.2
- Ruby 3.3
查看 .github/workflows/ruby_compatibility.yml 了解详情。
不同 Ruby 版本可能生成不同的 Gemfile.lock。建议:
- 在切换版本前删除
Gemfile.lock - 或者不提交
Gemfile.lock到版本控制
某些测试可能需要 AWS 凭证才能通过。只要 gem 能成功加载,就表示基本兼容性没问题。
如果遇到 nokogiri 编译问题(jeweler 的依赖),可以:
bundle config build.nokogiri --use-system-libraries
bundle install或者跳过开发依赖:
bundle install --without development