无法在shell脚本中运行npm

时间:2017-04-13 14:20:15

标签: node.js shell ssh npm nvm

在持续部署上下文中,我执行了一个shell脚本来更新在远程服务器中重启我的应用程序

脚本是:

ssh user@myserver <<'ENDSSH'
cd /opt/myapp
git pull
npm i
forever stop src
npm run staging
ENDSSH

输出是:

stdin: is not a tty
Already up-to-date.
-bash: line 3: npm: command not found
-bash: line 4: forever: command not found
-bash: line 5: npm: command not found

注意:

  • 如果我ssh到远程服务器并手动输入这些命令

  • ,一切都会正常工作
  • node和npm在远程服务器上安装了nvm which npm/root/.nvm/versions/node/v6.10.0/bin/npm

3 个答案:

答案 0 :(得分:4)

如果您node中安装了npm/root/.nvm/versions/node/v6.10.0/bin,那么将其添加到您的脚本应该可以解决问题:

PATH="/root/.nvm/versions/node/v6.10.0/bin:$PATH"

或者,您可以尝试使用绝对路径,如:

/root/.nvm/versions/node/v6.10.0/bin/npm install

等。但是注意如果你从二进制包中安装了Node而不是源代码,那么npm二进制文件中的shebang行可能会#!/usr/bin/env node 不会工作当PATH中正确的Node版本时 - 请参阅此答案以获取更多信息:

当从源安装Node时,npm将有一个正确的shebang行,其中包含node二进制文件的绝对路径,并且当node不在PATH中时可以使用。

答案 1 :(得分:2)

不要做@rsp建议的事情,而不是对版本进行硬编码 您应该像这样来源NVM脚本:

. /root/.nvm/nvm.sh

如果您设置默认版本,NVM应该为您解析版本, 这样你就不会因为更新到更新的NodeJS版本而回到那个脚本。

答案 2 :(得分:1)

我在詹金斯面临着同样的问题。

以下几行位于.bashrc文件的底部,我只是放在.bashrc文件的顶部

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