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