RubyGems、Ruby、Bundler版本与RVM、Capistrano部署冲突排查
Ruby on Rails + Capistrano部署问题及疑问
背景
我有一个老旧的Ruby on Rails项目,采用Capistrano部署流程,当前运行Ruby 2.5.1和Rails 5.2。更新项目时可能破坏了旧部署环境,现需修复Capistrano部署流程以安装补丁,之后再迁移到新环境。
我使用rvm管理不同Ruby版本:
- 本地环境:Ruby 2.5.1、gem 3.2.3、bundle 1.17.3,项目运行正常,Gemfile.lock标注该bundle版本
- 服务器环境:Ruby 2.5.1、gem 2.7.6、bundle 1.16.1(已安装rvm)
部署时触发错误:
rubygems.rb:289:in 'find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
当前项目的Gemfile.lock明确显示使用1.17.3打包,但服务器执行gem list bundle仅返回1.16.1版本,且/home/deploy/.rvm/gems/ruby-2.5.1/gems/目录下无bundler 1.17.3的文件。我计划在服务器安装bundle 1.17.3,但操作前需明确以下问题:
核心疑问
- gem(RubyGem)版本与Ruby版本有何关联?是否需要严格匹配?
- RubyGems版本如何确定?服务器未安装Ruby 2.7.6却有gem 2.7.6是怎么回事?
- RubyGems不同版本间的差异是什么?
- Capistrano为何不自动安装Gemfile.lock指定的bundler版本?它是否负责安装gem?如何控制它安装的gem版本?
- 上次部署时,Gemfile.lock已有
BUNDLED WITH 1.17.3标记,但服务器无对应版本却部署成功,现在为何失败?
额外疑问
- 为何工具名为bundler和RubyGems,而实际运行的命令是
bundle和gem? - 除了CLI工具外,bundler还有哪些核心内容?
内容的提问来源于stack exchange,提问作者MDickten
相关产品推荐
相关产品推荐

