cap production deploy报rbenv: bundle command not found如何修复
问题根因
部署报错的核心原因是配置与服务器实际版本管理工具不匹配:
- 当前Capfile强制引入了
capistrano/rbenv适配插件,整个部署流程会按照rbenv的路径规则加载Ruby运行环境、执行所有shell命令 - 生产服务器实际使用rvm管理Ruby版本,服务器上并未部署rbenv工具链,rbenv的路径规则下自然找不到已安装在rvm目录下的
bundle可执行程序,最终触发退出码127、rbenv: bundle: command not found的报错 - 虽然服务器手动执行
bundle -v、ruby -v可以正常返回结果,但这是因为用户交互式shell已经加载了rvm的环境配置;而Capistrano的非交互式SSH连接不会加载用户shell的默认环境配置,完全依赖引入的版本管理插件来加载对应环境路径。
修复步骤
按照以下顺序调整配置即可解决问题:
- 移除Capfile中错误的rbenv相关配置
- 删掉
require 'capistrano/rbenv'这行插件引入代码 - 删掉
set :rbenv_ruby, '2.2.10'这行rbenv版本配置代码
- 删掉
- 引入rvm对应的Capistrano适配插件
- 在Capfile的插件引入块中添加
require 'capistrano/rvm' - 在Capfile中新增rvm版本配置,与服务器实际安装的Ruby版本保持一致:
set :rvm_ruby_version, '2.2.10'
- 在Capfile的插件引入块中添加
- 安装对应Capistrano依赖
- 在项目Gemfile的部署依赖分组中添加
gem 'capistrano-rvm' - 本地执行
bundle install安装该插件,避免加载任务时找不到对应代码
- 在项目Gemfile的部署依赖分组中添加
- 预校验配置有效性
- 本地执行
cap production rvm:check,确认插件可以正常识别服务器上的rvm安装路径、对应Ruby版本与bundler可执行文件路径
- 本地执行
注意事项
- 禁止同时在Capfile中引入rbenv、rvm两个版本管理插件,二者的环境加载逻辑存在冲突,极易出现路径匹配混乱的问题
- 当前服务器上rvm安装在deployer用户的本地目录
/home/deployer/.rvm/下,无需额外配置全局环境变量,capistrano-rvm插件会自动对应用户目录下的rvm路径 - 完成所有配置调整后,重新执行
cap production deploy即可正常通过bundler:install任务
内容的提问来源于stack exchange,提问作者user14426719
相关产品推荐
相关产品推荐

