Capistrano部署报错Yarn需Node.js4.0+但远程环境已正常安装
问题解决方法
核心原因
Capistrano通过SSH执行远程命令时默认启动的是非登录、非交互shell,远程服务器对应用户的.bashrc文件默认存在[ -z "$PS1" ] && return判断,非交互模式下会直接终止加载后续配置,因此你写在.bashrc里的nvm环境变量不会被Capistrano读取,导致PATH缺少node、yarn的对应路径。
解决方案
你可以任选以下一种方案解决:
方案1:配置Capistrano默认环境变量(最稳妥,无需修改服务器配置)
确认远程服务器nvm安装路径和所用node版本路径后,在config/deploy.rb中添加如下配置即可:# 路径替换为你服务器实际的nvm对应node版本路径、nvm shims路径 set :default_env, { path: "$HOME/.nvm/versions/node/v16.9.1/bin:$HOME/.nvm/shims:$PATH" }配置完成后所有Capistrano执行的远程命令都会优先使用该PATH下的node、yarn。
方案2:修改远程服务器
.bashrc加载逻辑
SSH登录部署用户的远程服务器,编辑~/.bashrc文件,将原本写在文件中的nvm初始化配置(如下所示)移动到文件开头[ -z "$PS1" ] && return判断的前面:export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"修改后非交互shell也会正常加载nvm环境变量,Capistrano即可识别到正确的node版本。
方案3:使用
capistrano-nvm插件自动管理
如需避免手动维护路径,可以引入专门的插件处理nvm环境:- 在Gemfile的部署分组中添加依赖:
group :development, :deploy do # 原有其他gem保留,新增如下 gem 'capistrano-nvm', require: false end- 本地执行
bundle install安装依赖 - 在项目
Capfile中添加引入:
require 'capistrano/nvm'- 在
config/deploy.rb中指定所用node版本:
set :nvm_type, :user set :nvm_node, 'v16.9.1'
验证方法
配置完成后执行你之前编写的debug任务cap staging debugs,检查输出的PATH是否已经包含nvm的对应路径,确认正常后重新执行部署即可。
内容的提问来源于stack exchange,提问作者chmich
相关产品推荐
相关产品推荐

