Published on

Git Hooks 与 Node 环境问题

Authors

Git Hooks 与 Node 环境问题

🧠起因

我在之前解决了 Git Hooks与多JDK环境问题解决 的这个问题。但在今天又出现了本地node环境🪝钩子读不到了。真的是命运多舛。

📖

如果您还没有阅读过 JDK 环境问题的解决方案,建议先查看 Git Hooks与多JDK环境问题解决 这篇文章,了解如何使用 SDKMAN 管理 Java 环境。

Git Hook 环境错误

npx: command not found

错误代码: 127

PATH: node_modules/.bin:/opt/homebrew/opt/git/libexec/git-core:/usr/bin:/bin:/usr/sbin:/sbin

  • Git hook 无法读取到 node 环境
  • node_modules 文件夹中没有 npx 执行文件
  • PATH 环境变量配置问题

错误内容如下:

# 下面这一行是 sdkmanrc 的配置环境
-e Using java version 8.0.452-amzn in this shell.
# 这里开始是我的 node 环境问题
.husky/pre-commit: line 16: npx: command not found
husky - pre-commit script failed (code 127)
husky - command not found in PATH=node_modules/.bin:/opt/homebrew/opt/git/libexec/git-core:/usr/bin:/bin:/usr/sbin:/sbin

从上面的 shell 日志来看,git hook 是读不到我的 node 环境了。同时项目中使用npm install安装的node_modules文件夹里也没有npx的执行文件。

❌问题点

我的开发电脑是 MacBook Pro M1 Pro 版本的。第一次接触Mac系统的开发同学在拿到电脑安装自己的shell环境时我想会有部分同学和我一样使用Homebrew。 但是不得不说这个组建安装确实方便,只需要brew install xxx即可。但随之也会带来环境不匹配的问题。

Homebrew

问题环境
路径:/opt/homebrew/bin/
问题:

环境不匹配,与生产环境差异过大

优点:
  • 安装方便
  • 包管理统一
缺点:
  • 路径与标准环境不同
  • 可能导致兼容性问题
  • Git hooks 无法正确识别

原生环境

推荐环境
路径:/usr/bin/
问题:

生产环境标准

优点:
  • 与生产环境一致
  • 兼容性好
  • Git hooks 正常工作
缺点:
  • 需要手动管理版本
  • 安装相对复杂

在写这份文档之前我的 shell 环境用的都是 brew 就行安装的。 具体的问题就是 brew install 的内容是放在/opt/homebrew/bin/这个目录下面,与实际读取原生环境会有差别。 更多的Linux开发者与Unix开发者会使用/usr/bin、/usr/sbin/等这些目录获取需要使用的可执行文件,这与实际的生产环境相差过大。

##🔧解决方案

既然我们清楚问题在哪了。那就开始着手解决吧! 我的问题是 brew install nodegit hook 读取不到 我后面说明的都是如何解决这个问题

💡

这个问题与之前解决的 JDK 环境问题 类似,都是由于环境管理工具导致的 PATH 配置问题。不同的是,这次我们需要管理 Node.js 环境而不是 Java 环境。

卸载 Node

使用 brew uninstall node 卸载当前环境

安装 NVM

安装 Node Version Manager 进行版本管理

安装 Node

使用 NVM 安装指定版本的 Node.js

卸载node

卸载 Node.jsshell
brew uninstall node
卸载 npm(可选)shell
npm uninstall npm -g
验证卸载结果shell
node -v\nnpm -v

至此完成在 brew 下安装的 node 环境卸载。下面开始安装 nvm

安装 nvm

什么是 nvm 还请自行谷歌

我们使用 nvm 作者在 GitHub 上给出的指令。 GitHub:https://github.com/nvm-sh/nvm

安装 NVMshell
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
验证 NVM 安装shell
nvm -v
查看可用的 Node 版本shell
nvm ls-remote
安装指定版本的 Node.jsshell
nvm install v22.16.0

OK了。能跑到这说明你已经完成了。接下来正常使用就行。

📝 总结

通过这次问题的解决,我总结出了一些关于开发环境管理的重要经验:

🔄 环境管理工具的选择

  1. 避免使用 Homebrew 安装开发语言环境:虽然 Homebrew 安装方便,但会导致路径不一致,影响 Git hooks 的正常工作
  2. 推荐使用版本管理工具
    • Java 环境:使用 SDKMAN 进行管理
    • Node.js 环境:使用 NVM 进行管理
    • Python 环境:使用 pyenv 进行管理

🔗 相关文章

💡 最佳实践

  1. 统一环境管理:在团队中统一使用相同的环境管理工具
  2. 项目配置:在项目中添加相应的配置文件(如 .sdkmanrc.nvmrc
  3. 文档记录:将环境配置步骤记录在项目文档中,方便团队成员快速搭建环境

这样,无论是 Java 还是 Node.js 环境问题,都能得到妥善解决,确保 Git hooks 能够正常工作。