如何通过 git 在部署项目上运行 npm?(钩子/后接收:npm:未找到命令)

Fue*_*ter 3 git ubuntu node.js npm digital-ocean

问题

我创建了一个项目,其中使用 Apache 和 Git 在 DigitalOcean 中配置服务器。

对于服务器上的 init 项目,我运行以下命令:

cd /var/repo
mkdir project-example.git && cd project-example.git
git init --bare
Run Code Online (Sandbox Code Playgroud)

post-receive使用以下代码设置文件:

#!/bin/bash
git --work-tree=/var/temp/project-example --git-dir=/var/repo/project-example.git checkout -f
cd /var/temp/project-example
npm install
npm run build
rm -rf /var/www/project-example/*
mv -f /var/temp/project-example/build/* /var/www/project-example/
Run Code Online (Sandbox Code Playgroud)

当我通过机器本地上的 git 推送到远程服务器时,出现以下错误:

remote: hooks/post-receive: line 4: npm: command not found
remote: hooks/post-receive: line 5: npm: command not found
Run Code Online (Sandbox Code Playgroud)

但是,通过SSH访问服务器并执行命令:

# it works standard
cd /var/repo/project-example.git
source hooks/post-receive
Run Code Online (Sandbox Code Playgroud)

注释

系统服务器:Ubuntu 14.04

我通过 nvm 安装了节点。

Dav*_*sch 7

当 git hook 运行时,它不一定具有与通过 SSH 登录时相同的 PATH 变量集。调用时尝试将 npm 的完整路径放在脚本中;那应该解决问题。

更新(2019 年 6 月 7 日):

一些评论者在使用上述解决方案时遇到了找不到节点的问题,这让我意识到它不是很健壮。与其将路径放在对 npm 本身的调用中,不如将必要的路径添加到脚本的环境中,例如,如果 npm(和节点)碰巧在 中/usr/bin/,请在调用 npm 之前将以下内容添加到脚本中:

export PATH=$PATH:/usr/bin
Run Code Online (Sandbox Code Playgroud)

事实上,确保钩子的工作方式与通过 SSH 登录时相同的一种更可靠的方法是找出登录时的路径(即 的输出echo $PATH)并在您的相应的钩子脚本(当然你可能需要省略一些用户特定的路径等)

  • @Florian/@DavidTrinh/@subdesign - 我更新/改进了我的答案以回应您的评论。 (2认同)
  • 感谢你的回答。在我的情况下(使用 nvm 安装的节点)路径应该是这样的:export PATH=$PATH:/home/USER/.nvm/versions/node/v13.12.0/bin (2认同)