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

问题描述 投票:0回答:2

问题

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

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

cd /var/repo
mkdir project-example.git && cd project-example.git
git init --bare

我使用以下代码设置文件

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/

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

remote: hooks/post-receive: line 4: npm: command not found
remote: hooks/post-receive: line 5: npm: command not found

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

# it works standard
cd /var/repo/project-example.git
source hooks/post-receive

评论

系统服务器:Ubuntu 14.04

我通过nvm安装了node。

node.js git ubuntu npm digital-ocean
2个回答
11
投票

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

更新(2019 年 6 月 7 日):

一些评论者在使用上述解决方案时遇到了找不到节点的问题,这让我意识到它不是很健壮。您最好将必要的路径添加到脚本环境中,而不是将路径放在对 npm 本身的调用中,例如如果 npm (和节点)碰巧位于

/usr/bin/
中,请在调用 npm 之前将以下内容添加到脚本中:

export PATH=$PATH:/usr/bin

事实上,确保钩子与通过 SSH 登录时一样工作的更可靠方法是找出登录时的路径(即

echo $PATH
的输出)并设置相应的钩子脚本中的路径(当然你可能需要省略一些用户特定的路径等)


0
投票

如果您使用 NVM,将特定版本添加到路径会很痛苦,并且每次更新都会中断。我找到了这个替代答案,它解释了为什么正常使用 ssh 时 npm 可用,但不能通过 git hooks 可用(你不处于交互模式)。

在我的

.bashrc
中,底部有 3 行代码,用于整理正确的 npm 路径。将其移至文件顶部允许通过 git hooks 使用 npm。所以我的
.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

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
© www.soinside.com 2019 - 2024. All rights reserved.