不能在 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
注:
如果我通过 ssh 连接到远程服务器并手动输入这些命令,一切正常
node和npm在远程服务器上安装了nvm
which npm
给/root/.nvm/versions/node/v6.10.0/bin/npm
如果您的 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
等但是 注意 如果你的节点是从二进制包而不是源代码安装的,那么 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
在持续部署上下文中,我执行了一个 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
如果您的 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
等但是 注意 如果你的节点是从二进制包而不是源代码安装的,那么 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