【问题标题】:Cannot run npm in a shell script无法在 shell 脚本中运行 npm
【发布时间】:2017-09-09 17:22:40
【问题描述】:

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

【问题讨论】:

  • 所以看起来您正在尝试将 npm 与 nvm 一起使用。您是否尝试过在脚本中运行 nvm 命令来选择版本?在运行 npm 之前?
  • @wheeler 在脚本中添加了nvm --version。得到-bash: line 3: nvm: command not found
  • 在“连续部署上下文”中执行时,您使用的是哪个用户 - 与您 ssh 的用户相同?通过键入 node --version 确保 CI 用户可以使用节点
  • @GreensterRox 从安装了节点、npm 等的计算机上运行脚本时遇到了同样的问题。所以 CI 不是问题的根源

标签: node.js shell ssh npm nvm


【解决方案1】:

如果您的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

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

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

【讨论】:

  • PATH="/root/.nvm/versions/node/v6.10.0/bin:$PATH" 解决了我的问题
  • 如果你没有以root身份安装NVM,路径也可以是~/.nvm
【解决方案2】:

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

. /root/.nvm/nvm.sh

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

【讨论】:

    【解决方案3】:

    我在詹金斯遇到了同样的问题。

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

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2019-02-17
      • 2023-03-14
      • 1970-01-01
      • 2023-03-04
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多