You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:52