解决 Visual Studio 2022 中的 Husky 预提交挂钩问题

解决 Visual Studio 2022 中的 Husky 预提交挂钩问题
解决 Visual Studio 2022 中的 Husky 预提交挂钩问题

了解问题

我在包含 C# .NET Core 项目和 React 应用程序的存储库中遇到 Husky 预提交挂钩问题。 .git 目录位于根目录中,而 React 应用程序项目位于子目录(client-app)中。

当我尝试在 Visual Studio 2022 中的 Git 更改窗口中提交时,出现以下错误:奇怪的是,如果我在 VSCode 中或在 MS 终端中使用 Git CMD 行,它会正常提交。

命令 描述
execSync 从 Node.js 同步执行 shell 命令,用于运行 lint 和测试命令。
fs.readFileSync 同步读取文件内容,用于读取提交消息文件。
path.resolve 将路径序列解析为绝对路径,用于确定目录路径。
process.exit 使用指定的退出代码退出当前的 Node.js 进程,用于在发生错误时停止脚本。
cd "$(dirname "$0")/../.." Shell 命令将当前目录更改为项目的根目录。
npm run lint 运行 package.json 中定义的 lint 脚本来检查代码样式和错误。
npm test 运行 package.json 中定义的测试脚本来执行项目的测试。

详细脚本说明

提供的脚本旨在自动对包含 C# .NET Core 项目和 React 应用程序的存储库进行预提交检查。 Node.js 脚本利用 execSync 来自 child_process 同步运行 shell 命令的模块。这对于执行类似命令至关重要 npm run lintnpm testclient-app 目录。该脚本还利用 fs.readFileSync 读取提交消息,确保在预提交检查失败时可以停止提交过程。路径模块的 path.resolve 用于确定正确的目录路径,使脚本适应不同的环境。

在 shell 脚本中, cd "$(dirname "$0")/../.." 命令将当前目录更改为项目的根目录。接下来导航到 client-app 目录并运行 npm run lintnpm test。如果这些命令中的任何一个失败,脚本将退出并显示错误代码 exit 1。这些脚本与 Husky 的集成可确保在进行任何提交之前始终如一地执行代码质量检查,从而防止将问题引入代码库。

修复 Visual Studio 2022 的 Husky 预提交挂钩

使用 JavaScript 进行 Husky 配置

const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

const rootDir = path.resolve(__dirname, '..', '..');
const clientAppDir = path.resolve(rootDir, 'client-app');
const gitDir = path.resolve(rootDir, '.git');

if (!fs.existsSync(gitDir)) {
    console.error('Git directory not found');
    process.exit(1);
}

const commitMsg = fs.readFileSync(path.resolve(gitDir, 'COMMIT_EDITMSG'), 'utf-8');
if (!commitMsg) {
    console.error('No commit message found');
    process.exit(1);
}

try {
    execSync('npm run lint', { cwd: clientAppDir, stdio: 'inherit' });
    execSync('npm test', { cwd: clientAppDir, stdio: 'inherit' });
} catch (error) {
    console.error('Pre-commit checks failed');
    process.exit(1);
}

console.log('Pre-commit checks passed');
process.exit(0);

确保与 Visual Studio 2022 的兼容性

使用 Shell 脚本进行 Husky 预提交

#!/bin/sh
# Navigate to the root directory
cd "$(dirname "$0")/../.."

# Set the path to the client app
client_app_path="./client-app"

# Run lint and tests in the client app directory
cd "$client_app_path" || exit 1

echo "Running lint checks..."
npm run lint || exit 1

echo "Running tests..."
npm test || exit 1

echo "Pre-commit checks passed!"
exit 0

使用 Husky 自动化预提交检查

在 package.json 中配置 Husky

"husky": {
  "hooks": {
    "pre-commit": "npm run precommit"
  }
}

"scripts": {
  "precommit": "lint-staged"
}

"lint-staged": {
  "*.js": [
    "npm run lint",
    "npm test"
  ]
}

探索其他解决方案

尚未解决的一方面是 Node.js 环境对 Husky hooks 的潜在影响。不同版本的 Node.js 有时会导致各种 npm 包(包括 Husky)的兼容性问题。确保 Visual Studio 2022 中使用的 Node.js 版本与 VSCode 和 Git CMD 行中使用的版本匹配可以解决不一致问题。使用类似的工具 nvm (Node Version Manager)允许开发者轻松地在不同版本的 Node.js 之间切换。

此外,配置 Husky 以提供更详细的日志记录可以帮助查明问题所在。通过在 Husky 配置中添加详细日志记录选项,开发人员可以深入了解失败的特定步骤和命令。与 VSCode 和 Git CMD Line 相比,此信息对于识别 Visual Studio 2022 处理预提交挂钩方式的差异至关重要。

有关 Husky Pre-Commit Hook 的常见问题和解答

  1. 为什么 Husky hooks 在 Visual Studio 2022 中失败,但在 VSCode 中却失败?
  2. Visual Studio 2022 可能会以不同方式处理 Node.js 环境,从而导致 Husky 挂钩出现兼容性问题。
  3. 如何检查 Visual Studio 2022 使用的 Node.js 版本?
  4. 使用 node -v 在 Visual Studio 终端中使用命令检查 Node.js 版本。
  5. 什么是 nvm 它有何帮助?
  6. nvm (Node Version Manager)允许您轻松地在不同版本的 Node.js 之间切换,确保兼容性。
  7. 我该如何安装 nvm
  8. 按照官方说明进行操作 nvm 用于安装和设置的 GitHub 页面。
  9. 如何为 Husky 启用详细日志记录?
  10. 修改Husky配置 package.json 包括更详细的日志记录选项。
  11. 不同的 npm 包版本会导致问题吗?
  12. 是的,不匹配的 npm 包版本可能会导致 Husky hook 出现意外行为。
  13. 如何更新 npm 包以确保兼容性?
  14. 使用 npm update 命令将 npm 包更新到最新版本。
  15. 如果尽管执行了所有这些步骤,预提交挂钩仍失败,我该怎么办?
  16. 考虑联系 Husky 社区或检查 GitHub 问题以获取类似问题和解决方案。

总结解决方案

提供的解决方案利用 Node.js 脚本和 shell 命令来解决 Visual Studio 2022 中 Husky 预提交挂钩失败的问题。通过确保正确的 Node.js 版本、详细的日志记录和正确的 Husky 配置,开发人员可以维护一致的代码质量检查。本文涵盖了各种故障排除步骤,并强调了使用兼容的 npm 包版本的重要性。实施这些解决方案可以帮助防止提交错误并确保开发过程更加顺利。