不能在 shell 脚本中 运行 npm

Cannot run npm in a shell script

在持续部署上下文中,我执行了一个 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

注:

如果您的 nodenpm 安装在 /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

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

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

不要按照@rsp 的建议去做,而不是对版本进行硬编码 你应该像这样获取 NVM 脚本:

. /root/.nvm/nvm.sh

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

我在 jenkins 中遇到了同样的问题。

以下行在 .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