生产部署EC2应用时Node版本不兼容问题求助
解决Capistrano部署EC2时Node版本不兼容问题
核心问题
你之前的操作都在本地环境进行,但Capistrano部署是在EC2服务器上执行命令,服务器的Node版本仍为12.22.9,这才是导致版本不兼容的根本原因,本地修改不会同步到服务器。
解决步骤
1. 在EC2服务器上配置正确的Node版本
登录你的EC2服务器,执行以下操作:
- 安装nvm(Node版本管理器):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/latest/install.sh | bash - 重新加载shell配置文件(根据你使用的shell选择对应命令):
source ~/.bashrc # Bash用户 # 或 source ~/.zshrc # Zsh用户 - 安装指定的Node版本:
nvm install 14.21.3 - 设置该版本为服务器默认Node版本,确保后续会话自动使用:
nvm alias default 14.21.3 - 验证版本是否生效:
输出应为node -vv14.21.3
2. 让Capistrano部署时加载正确的Node环境
Capistrano的部署进程不会自动加载用户的shell配置,需要在部署配置中指定nvm路径和Node版本:
- 如果你使用
capistrano-nvm插件:- 在项目Gemfile中添加插件依赖:
gem 'capistrano-nvm' - 执行
bundle install安装插件 - 在Capfile中引入插件:
require 'capistrano/nvm' - 在
config/deploy.rb中配置Node版本:set :nvm_node, '14.21.3'
- 在项目Gemfile中添加插件依赖:
- 若不使用插件,直接在
config/deploy.rb中添加以下配置:set :nvm_path, '$HOME/.nvm' set :nvm_node, 'v14.21.3' SSHKit.config.command_map[:node] = "#{fetch(:nvm_path)}/versions/node/#{fetch(:nvm_node)}/bin/node" SSHKit.config.command_map[:npm] = "#{fetch(:nvm_path)}/versions/node/#{fetch(:nvm_node)}/bin/npm" SSHKit.config.command_map[:yarn] = "#{fetch(:nvm_path)}/versions/node/#{fetch(:nvm_node)}/bin/yarn"
3. 恢复本地依赖文件
之前删除的package-lock.json、yarn.lock无需再用--ignore-engines生成,直接从仓库恢复或重新生成正常版本后推送到仓库,服务器部署时会根据这些文件安装对应依赖。
重新部署
执行部署命令验证:
bundle exec cap production deploy
内容的提问来源于stack exchange,提问作者Azhar Sheikh
相关产品推荐
相关产品推荐

