Rails 5.1应用生产服务器RVM未读取.ruby-version问题求助
问题原因与解决方案
这个问题其实挺常见的——.ruby-version确实是本地开发环境用来指定Ruby版本的工具,但它在Capistrano部署流程里不会自动生效,得做一些配置才能让Capistrano“读懂”它。我来帮你拆解下可能的原因和解决办法:
1. 未给Capistrano配置RVM集成插件
Capistrano本身不会主动读取.ruby-version或与RVM交互,需要借助capistrano-rvm插件实现版本关联。按以下步骤配置:
- 在本地项目的Gemfile中添加插件:
gem 'capistrano-rvm', require: false - 执行
bundle install完成插件安装 - 打开项目根目录的Capfile,添加加载插件的代码:
require 'capistrano/rvm' - 重新运行部署命令,Capistrano就会自动读取
.ruby-version内容,切换到Ruby 2.5.0版本执行部署流程。
2. 服务器非交互式Shell未加载RVM
Capistrano部署使用的是非交互式Shell,而RVM通常在.bashrc或.zshrc这类交互式Shell配置文件中加载,非交互式Shell默认不会读取这些文件,导致RVM未生效,系统自动使用了默认的Ruby 2.4.0。
有两种解决方式:
方式一:将RVM加载到非交互式Shell配置文件
登录服务器,编辑用户主目录下的.bash_profile(若使用bash),添加以下内容:[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"这样无论哪种Shell环境,都会自动加载RVM。
方式二:在Capistrano配置中强制指定Ruby版本
打开deploy.rb,添加两行配置:set :rvm_type, :user # 指定使用用户级RVM,而非系统级 set :rvm_ruby_version, File.read('.ruby-version').strip # 直接读取本地.ruby-version的版本号强制Capistrano在部署时切换到指定的Ruby版本。
3. 手动进入current目录时Shell未自动切换版本
就算部署时用对了版本,手动登录服务器进入current目录时,非交互式Shell可能不会自动检测.ruby-version。这时可以手动执行切换命令:
rvm use 2.5.0 && RAILS_ENV=production bundle exec ruby --version
不过更根本的是让Capistrano在部署阶段就使用正确版本,这样bundle install也会基于Ruby 2.5.0安装依赖,避免后续版本不一致的问题。
内容的提问来源于stack exchange,提问作者user1130176
相关产品推荐
相关产品推荐

