【pre-commit/husky】配置

下面介绍 :

一、.git 跟 package.json 不在同一级目录下,怎么初始化husky 以及 同一配置 ~~
js 复制代码
projectRoot/
├── .git/
├── .gitignore
├── .nx
├── deploy/.gitkeep
├── src/
            ├── my-service/
                        |── src/
                       ├── mvnw.cmd
                        ├── pom.xml

            
            ├── my-ui/
                       ├── node_modules
                       ├── package.json 
                        |── src/
                        ├── pnpm-lock.yaml

my-ui 目录位于 src/ 子目录下,因此 my-ui 目录的相对路径到 .git 目录是 ../../.git。

基于.git 跟 package.json 不在同一层的目录,这种情况下, 如果在多人协作的项目中, 不可能让每个人都去.git/hooks/pre-commit 和 root/src/my-ui/.husky/pre-commit

这两个文件下去修改内容, 所以还是需要一个执行脚本去生成。

以下是一个脚本,用于统一管理和自动设置 pre-commit 钩子,以便在多人协作的项目中避免手动修改两个文件的内容。我们可以创建一个脚本,自动将 pre-commit 钩子同步到 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit 文件中。

脚本内容

bash 复制代码
#!/bin/bash

# Define paths
GIT_HOOKS_PATH=".git/hooks/pre-commit"
HUSKY_HOOK_PATH="src/my-ui/.husky/pre-commit"

# Define the common pre-commit content
PRE_COMMIT_CONTENT="#!/bin/sh
# Pre-commit hook to ensure consistent behavior in both locations
echo 'Running pre-commit hook...'
# Add your custom commands here, e.g., linting, formatting, tests
pnpm lint
"

# Function to create or update the hook file
update_hook() {
  local hook_path=$1
  echo "Updating $hook_path..."
  # Ensure the parent directory exists
  mkdir -p "$(dirname "$hook_path")"
  # Write the content to the hook file
  echo "$PRE_COMMIT_CONTENT" > "$hook_path"
  # Make the hook file executable
  chmod +x "$hook_path"
}

# Update both hooks
update_hook "$GIT_HOOKS_PATH"
update_hook "$HUSKY_HOOK_PATH"

echo "Pre-commit hooks have been updated successfully."

1. 使用说明

  1. 将此脚本保存为 update-hooks.sh 并放在项目根目录。

  2. 确保脚本有执行权限,运行以下命令:

    bash 复制代码
    chmod +x update-hooks.sh
  3. 每次需要更新 pre-commit 钩子时,运行脚本:

    bash 复制代码
    ./update-hooks.sh

2. 如何管理内容

  • PRE_COMMIT_CONTENT 变量中添加你的钩子逻辑,比如代码格式化、lint 或运行测试等。
  • 运行此脚本后,pre-commit 钩子的内容会同时更新到 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit 文件。

3. 验证脚本是否生效

检查 .git/hooks/pre-commit 文件
  1. 查看文件是否已创建并内容正确:

    bash 复制代码
    cat .git/hooks/pre-commit

    期望输出为 PRE_COMMIT_CONTENT 中定义的内容,例如:

    bash 复制代码
    #!/bin/sh
    # Pre-commit hook to ensure consistent behavior in both locations
    echo 'Running pre-commit hook...'
    pnpm lint
  2. 验证文件是否可执行:

    bash 复制代码
    ls -l .git/hooks/pre-commit

    你应该看到 -rwxr-xr-x 权限,表示文件可执行。

检查 src/my-ui/.husky/pre-commit 文件
  1. 查看 src/my-ui/.husky/pre-commit 文件内容:

    bash 复制代码
    cat src/my-ui/.husky/pre-commit

    内容应该与 .git/hooks/pre-commit 相同。

  2. 验证文件权限:

    bash 复制代码
    ls -l src/my-ui/.husky/pre-commit

    确保它也有可执行权限。输出应显示 -rwxr-xr-x 权限,表示文件是可执行的。

如果权限不足,运行以下命令手动修复:

js 复制代码
chmod +x .git/hooks/pre-commit src/my-ui/.husky/pre-commit

4. 测试钩子

测试 .git/hooks/pre-commit
  1. 创建或修改一个文件。

  2. 尝试提交更改:

    sql 复制代码
    git add .
    git commit -m "Test pre-commit hook"
  3. 如果钩子生效,终端会输出 Running pre-commit hook...,并运行 pnpm lint 命令。

测试 src/my-ui/.husky/pre-commit
  1. 如果你的项目配置了 husky,可以通过运行以下命令测试钩子:

    sql 复制代码
    pnpm husky add src/my-ui/.husky/pre-commit "echo 'Husky pre-commit hook test'"
  2. 提交代码,看是否运行新的逻辑。


脚本作用

  • 脚本运行后会同步两个位置的 pre-commit 文件,避免手动管理。
  • 你可以通过运行和观察测试结果,验证钩子是否按照预期运行。

二、update.hooks.sh 脚本 , 还需要在 scripts里面加命令么

js 复制代码
"scripts": {
    "prepare": "husky install" 
}

如果你已经有了 update-hooks.sh 脚本并用它来统一更新 Git 钩子和 Husky 配置,那么在 scripts 中添加 "prepare": "husky install"不必要的。以下是原因和场景分析:


为什么不需要再添加 "prepare": "husky install"

  1. update-hooks.sh 脚本已经覆盖了钩子配置:

    • 你的脚本 update-hooks.sh 会自动更新 .git/hooks/pre-commitsrc/my-ui/.husky/pre-commit
    • 这使得 Husky 的初始化由脚本集中管理,无需额外的 prepare 脚本。
  2. 避免冲突和重复:

    • 如果同时存在 update-hooks.sh"prepare": "husky install",可能导致路径或行为上的冲突。
    • 统一管理钩子的方式更清晰(即只通过 update-hooks.sh 来初始化或更新)。

何时需要 "prepare": "husky install"

  • 如果没有 update-hooks.sh 脚本:

    • 此时,需要通过 prepare 脚本确保 Husky 钩子自动安装到 .git/hooks
  • 团队需要自动化安装流程:

    • 如果团队成员克隆项目后直接运行 pnpm install,自动完成 Husky 初始化是一个便利的选择。

推荐方案

如果保留 update-hooks.sh
  1. 不要在 scripts 中添加 prepare

    • 通过运行 ./update-hooks.sh 管理钩子。
    • 确保团队成员在每次拉取代码后运行此脚本。
  2. 更新项目文档:

    • 在团队文档中明确说明,需要运行 ./update-hooks.sh 来初始化钩子。
如果更喜欢自动化方式(不使用脚本):
  1. 移除 update-hooks.sh

    • src/my-ui/package.json 中添加以下内容:

      json 复制代码
      "scripts": {
        "prepare": "husky install src/my-ui/.husky"
      }
    • 每次运行 pnpm install 时,钩子会自动安装。

  2. 手动运行 Husky 命令初始化:

    bash 复制代码
    cd src/my-ui
    pnpm install

总结

  • 如果你有 update-hooks.sh,就 不需要 再添加 "prepare" 脚本。
  • 如果想要更自动化的流程并愿意移除脚本,则可以使用 "prepare": "husky install"
相关推荐
高山我梦口香糖39 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
m0_7482352442 分钟前
前端实现获取后端返回的文件流并下载
前端·状态模式
m0_748240252 小时前
前端如何检测用户登录状态是否过期
前端
black^sugar2 小时前
纯前端实现更新检测
开发语言·前端·javascript
寻找沙漠的人2 小时前
前端知识补充—CSS
前端·css
GISer_Jing2 小时前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_748245522 小时前
吉利前端、AI面试
前端·面试·职场和发展
理想不理想v3 小时前
webpack最基础的配置
前端·webpack·node.js
pubuzhixing3 小时前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github
2401_857600953 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js