无法在shell脚本中运行npm

Jor*_*ane 9 ssh shell node.js npm nvm

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

脚本是:

ssh user@myserver <<'ENDSSH'
cd /opt/myapp
git pull
npm i
forever stop src
npm run staging
ENDSSH
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

注意:

  • 如果我ssh到远程服务器并手动输入这些命令,一切都会工作

  • 节点和故宫都安装了NVM上的远程服务器 which npm给予/root/.nvm/versions/node/v6.10.0/bin/npm

The*_*yer 6

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

. /root/.nvm/nvm.sh
Run Code Online (Sandbox Code Playgroud)

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


Shr*_*ash 6

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

以下几行位于 .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
Run Code Online (Sandbox Code Playgroud)


rsp*_*rsp 5

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

PATH="/root/.nvm/versions/node/v6.10.0/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

另外,您可以尝试使用绝对路径,例如:

/root/.nvm/versions/node/v6.10.0/bin/npm install
Run Code Online (Sandbox Code Playgroud)

等,但注意到,如果你有二进制包,而不是从源代码安装的节点,然后在你的家当线npm二进制将可能是#!/usr/bin/env node将无法正常工作时,节点的路径中正确的版本-看到这个答案的详细信息:

从源代码安装Node时,npm它将具有正确的shebang行,并带有指向node二进制文件的绝对路径,并且可以在node不在PATH中的情况下使用。