如何在 Composer 專案中管理本地的 Git 鉤子?

qbhy發表於2019-12-24


為什麼要使用git鉤子?

不知道大家有沒有遇到過多人協作開發的時候,有些同學的程式碼習慣不格式化,甚至有錯別字或者低階語法bug,為此我們通常會對自己和別人的程式碼做一些限制,比如程式碼風格,程式碼質量這些。團隊協作的時候我們可以透過鉤子來防止我們把質量不過關的程式碼提交到伺服器,避免bug發生,比如在pre-commit鉤子裡面使用php-cs-fixer做一些基礎的語法檢查和格式化程式碼,甚至可以加上phpunit執行測試用例的程式碼,用於防止有bug的程式碼被提交。

php專案管理git鉤子的兩種方式

在php專案中,通常可以用以下兩種方式來管理git鉤子

  1. 直接編輯本地的 .git/hooks/{hook} 檔案。

  2. 使用 composer-git-hooks 管理鉤子。

兩種方式的優缺點

第一種 - 手動改 .git/hooks/{hook}

優點:靈活,不需要依賴composer,任意git專案都可以使用。

缺點:如果在其他環境clone該專案,需要再次手動修改 .git/hooks 目錄。

第二種 - 使用 composer-git-hooks 管理

優點:鉤子管理起來更方便(畢竟通常IDE會隱藏 .git 目錄),可以在各個環境同步鉤子程式碼。

缺點:必須使用composer,其實這個也不算什麼缺點了,畢竟composer已經那麼普遍了。

composer-git-hooks 的使用

  1. 安裝 composer-git-hooks 
$ composer require brainmaestro/composer-git-hooks
  1. 配置 composer.json
"extra": {
        // 省略其他部分...
        "hooks": {
            "pre-commit": [
              "echo committing as $(git config user.name)",
              "vendor/bin/php-cs-fixer fix .",// 語法檢查
              "vendor/bin/phpunit" // 執行測試用例
            ]
        }
},
 "scripts": { 
 // 下面這兩句加了之後每次composer inistall 和 update都會更新鉤子
        "post-install-cmd": "cghooks add --ignore-lock",
        "post-update-cmd": "cghooks update"
    }

同理你也可以在hooks裡面新增其他git鉤子,git支援以下幾種鉤子,詳細請移步 git鉤子

  • applypatch-msg

  • commit-msg

  • fsmonitor-watchman

  • post-update

  • pre-applypatch

  • pre-commit

  • pre-push

  • pre-rebase

  • pre-receive

  • prepare-commit-msg

  • update

需要注意的是,如果composer.json與.git不是在同一個目錄下,還需要加--git-dir引數,比如 vendor/bin/cghooks add --git-dir="../.git"

如上操作完成後,你可以手動執行 vendor/bin/cghooks add  或者 composer install來新增鉤子。vendor/bin/cghooks 支援 add、update、remove 等幾個命令來管理hooks。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章