使用Capistrano 3在远程服务器执行npm install时遇npm未找到错误
解决Capistrano执行npm install时"npm: command not found"的问题
问题分析
远程服务器已通过nvm安装npm,但Capistrano执行部署任务时找不到npm命令,核心原因有两点:
- Capistrano默认使用非登录、非交互Shell,不会自动加载
~/.bashrc或~/.profile中的nvm环境配置 - 直接用字符串形式的
execute调用命令,可能无法正确继承set :default_env中设置的环境变量
解决方案
方案1:直接使用npm的绝对路径
跳过环境变量配置,直接指定npm的完整路径执行:
namespace :npm do desc 'Run npm install (locally project)' task :install do puts "--> Installing npm install (middle) " on roles(:app) do execute "cd #{release_path}/angular && /home/oasis/.nvm/versions/node/v8.9.4/bin/npm install" end end end
方案2:加载nvm环境后执行
在执行npm命令前,先加载nvm的配置脚本并切换到对应node版本:
namespace :npm do desc 'Run npm install (locally project)' task :install do puts "--> Installing npm install (middle) " on roles(:app) do execute "source ~/.nvm/nvm.sh && nvm use v8.9.4 && cd #{release_path}/angular && npm install" end end end
方案3:通过with_env确保环境变量生效
使用Capistrano的with_env方法显式传递环境变量,确保Shell能识别npm路径:
set :default_env, { path: "$PATH:/home/oasis/.nvm/versions/node/v8.9.4/bin"} namespace :npm do desc 'Run npm install (locally project)' task :install do puts "--> Installing npm install (middle) " on roles(:app) do with_env fetch(:default_env) do execute "cd #{release_path}/angular && npm install" end end end end
内容的提问来源于stack exchange,提问作者oracle972
相关产品推荐
相关产品推荐

