飞行计划脚本尝试在远程计算机上运行“npm install”时失败

我的飞行计划脚本如下所示:

// run commands on remote hosts (destinations) plan.remote(function(remote) { remote.log('Copy to remote host in folder: ' + tmpDir); remote.sudo('cp -R /tmp/' + tmpDir + ' ~', {user: username}); remote.log('Delete temporary local directory'); remote.rm('-rf /tmp/' + tmpDir); remote.log('Install dependencies'); remote.exec('cd ' + tmpDir); remote.sudo('npm --production install', {user: username}); remote.log('Reload application'); remote.sudo('ln -snf ~/' + tmpDir + ' ~/' + appName, {user: username}); }); 

脚本运行正常,直到遇到“npm –production install”行。

这里是日志:

 Copy to remote host in folder: node-app-1452386549897 104.131.12.146 $ sudo -u deploy -i bash -c 'cp -R /tmp/node-app-1452386549897 ~' 104.131.12.146 ● ok 104.131.12.146 Delete temporary local directory 104.131.12.146 $ rm -rf /tmp/node-app-1452386549897 104.131.12.146 ● ok 104.131.12.146 Install dependencies 104.131.12.146 $ cd node-app-1452386549897 104.131.12.146 ● ok 104.131.12.146 $ npm --production install 104.131.12.146 > bash: npm: command not found failed(127) 

虽然它说npm命令没有find..该命令是非常多的远程机器上存在

任何想法可能会导致这个问题?

这是远程计算机上部署用户的path(具有sudofunction)

 /home/deploy/.nvm/v4.2.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

这里是root用户在远程机器上的path:

 /root/.nvm/v4.2.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

这是npm的path:

 /home/deploy/.nvm/v4.2.2/bin/npm /root/.nvm/v4.2.2/bin/npm 

我为根和部署分别安装它

刚刚发现问题的解决scheme: 处于意外状态的远程上下文 。

在默认情况下以非交互式状态执行shell时,不加载nvm

要解决这个问题:

打开/root/.bashrc文件,在[ -z "$PS1" ] && returnexpression式之前移动与nvm相关的行。

最后你会得到这样的东西:

 export NVM_DIR="/root/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" [ -z "$PS1" ] && return 

我有同样的问题。 我find的解决scheme在这里解释: https : //dhampik.com/blog/nodejs-deploy-nvm

我打开了deploy用户的/home/deploy/.bashrc文件,并在安装nvm之后移动了位于文件末尾的行:

 export NVM_DIR="/home/deploy/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 

在线以上:

 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac