如何用composer scripts设置git的pre-commit钩子

如何用composer scripts设置git的pre-commit钩子
最新回答
云散风尽独留

2022-04-30 20:16:09

通过Composer的scripts功能设置Git的pre-commit钩子,可实现代码检查流程的自动化与统一管理。以下是具体操作步骤及注意事项:

1. 创建pre-commit脚本文件

在项目根目录下创建scripts/pre-commit文件,内容示例如下:

#!/bin/bashecho "Running pre-commit checks..."# PHP语法检查git diff --cached --name-only --diff-filter=ACM | grep '.php$' | xargs -r php -l# 其他检查(示例:PHP-CS-Fixer、PHPStan)# vendor/bin/php-cs-fixer fix --dry-run --using-cache=no# vendor/bin/phpstan analyse src/if [ $? -ne 0 ]; then echo "Pre-commit checks failed." exit 1fiecho "All checks passed."exit 0

赋予执行权限

chmod +x scripts/pre-commit2. 配置composer.json的scripts字段

在composer.json中添加post-install-cmd和post-update-cmd,用于自动链接钩子。

方案一:直接复制脚本(简单场景)"scripts": { "post-install-cmd": [ "cp scripts/pre-commit .git/hooks/pre-commit" ], "post-update-cmd": [ "cp scripts/pre-commit .git/hooks/pre-commit" ]}

适用场景:项目较小,无需复杂逻辑。

方案二:使用自定义PHP类(推荐)
  1. 创建处理类在src/Composer/ScriptHandler.php中定义逻辑:<?phpnamespace ScriptsComposer;use ComposerScriptEvent;class ScriptHandler { public static function linkPreCommitHook(Event $event) { $from = __DIR__ . '/../../scripts/pre-commit'; $to = __DIR__ . '/../../.git/hooks/pre-commit'; if (file_exists($from)) { copy($from, $to); chmod($to, 0755); // 确保可执行 echo "Git pre-commit hook installed.n"; } else { echo "Pre-commit script not found: $fromn"; } }}
  2. 配置composer.json确保类可被自动加载,并添加调用命令:"autoload": { "psr-4": { "ScriptsComposer": "src/Composer/" }},"scripts": { "post-install-cmd": [ "ScriptsComposerScriptHandler::linkPreCommitHook" ], "post-update-cmd": [ "ScriptsComposerScriptHandler::linkPreCommitHook" ]}
3. 注意事项
  • .git/hooks目录特性Git钩子存储在.git/hooks/下,不会被版本控制。团队成员需运行composer install或composer update触发钩子安装。

  • 团队协作说明在项目文档(如README)中明确告知开发者:

    首次克隆后需执行composer install。

    钩子依赖的代码检查工具(如PHPStan、PHP-CS-Fixer)需通过Composer安装。

  • 性能优化

    避免在钩子中执行耗时操作(如完整代码分析),推荐使用--dry-run模式快速检查。

    针对特定文件类型(如.php)过滤,减少不必要的检查。

  • 权限问题

    确保.git/hooks/pre-commit具有可执行权限(chmod +x)。

    若使用自定义类,确认PHP进程有权限访问脚本文件。

4. 扩展建议
  • 多阶段检查:在钩子中分步执行语法检查、代码风格修复、静态分析等。
  • 错误处理:通过$?检查上一条命令的退出状态,失败时立即终止提交。
  • 日志记录:将检查结果输出到文件,便于调试。

通过上述步骤,可实现Git pre-commit钩子的自动化配置,确保团队代码质量检查流程的一致性。