簡體   English   中英

PHP Codesniffer(PHPCS)-在用作SVN預提交掛鈎的一部分時如何允許覆蓋?

[英]PHP codesniffer (phpcs) - how to allow override when using as part of a svn pre-commit hook?

我們有一個PHP 5 Web應用程序,我們目前正在評估PHP CodeSniffer ,以便確定強制代碼標准是否可以提高代碼質量。

我們將subversion用於代碼存儲庫和部署基礎,並且我添加了SVN pre-commit鈎子,以確保所有提交的文件都沒有編碼標准的氣味。 該掛鈎在技術上是可行的,但會導致太多麻煩而無法實際使用:

  1. 如果我們必須修復導致站點中斷的緊急錯誤,那么我們需要做的最后一件事就是由於一些較小的空格縮進問題而拒絕提交。
  2. 我們有很多的的有幾百個,有時錯誤phpcs的遺留代碼-這是不務實的,現在來修復這些文件中的所有phpcs錯誤。 一個示例是一個充滿功能的文件,這些文件沒有文檔注釋 另一個例子是,如果一個類名以小寫字母開頭,則會引發一個錯誤,但是要解決這個問題,可能需要更改10、20+個文件,這些文件需要提交,然后才能被嗅探,遞歸...
  3. 我們有些文件有些大(例如4000行代碼?),phpcs需要幾分鍾的時間來檢查它們。 將提交延遲這么長時間是不可接受的。
  4. 我還沒有測試過,但是我想如果您執行svn分支並提交,phpcs將檢查所有內容並花費很長時間檢查所有1000個文件?

鑒於我們今天無法重構整個代碼庫-有人知道我如何使用svn commit參數,該參數將告訴svn pre-commit鈎子不運行phpcs嗎?

也許還有另一種方法可以消除上述頭痛?

為什么要在預提交時運行它? 我已經使用PHPUnderControlHudson來自動化php“構建” ...基本上,他們運行一個ant / phing構建腳本,該腳本在每次提交(自動檢測到)后運行自動化測試(PHPUnit)和代碼質量掃描程序(包括PHPCS)。 。 因此它不會拒絕提交,但會向您希望構建失敗的任何人發送一封不錯的電子郵件,並列出原因(有問題的代碼的特定行)...

我們發現以下工作效果很好,平衡了獲取代碼而無需大驚小怪的需求,但是可以防止發布與我們的標准不一致的版本。

首先,我們對提交有一個“開放武器”政策:

  • 接受所有代碼,無論工作與否,一致與否,只要其提交日志消息具有錯誤跟蹤ID(預提交鈎子檢查)即可
  • 鼓勵頻繁的提交及其好處:協作,撤消,備份

然后,我們在暫存/發行版本上采取“緊握拳頭”政策:

  • 如果違反規則,則構建會失敗,甚至微不足道,這意味着:強制性語法正確性,標准合規性,代碼文檔以及所有測試均以通俗易懂的方式通過
  • 防止釋放任何越野車。 如果確實有錯誤,那是代碼問題和構建問題(處理漏洞,測試不足等)。

所有這些都是通過使用phpcs(當然還有phpunit,phpdocumentor等)通過phing自動化的。

我認為ircmaxell有一個很好的觀點-這種標准檢查應該在提交前的鈎子之外進行,例如在連續集成環境中或在緊要關頭,提交后的鈎子應該基於提供的信息而不是阻塞承諾!

考慮到這一點,我暫時決定使用選擇加入方法。 我配置了svn pre-commit鈎子,以在提交消息中查找關鍵字,如果找到則運行phpcs

在預提交的鈎子腳本中,例如/var/www/svn/repos/<reponame>/hooks/

#!/bin/sh

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/bin/scripts/phpcs-svn-pre-commit

if [[ `$SVNLOOK log -t $TXN $REPOS | tr "[:upper:]" "[:lower:]"` =~ "\[?standardcode\]?" ]]; then

  # Run the PHP code sniffer                                                                                                                     
  PHPCS_STRICT=`$PHPCS "$REPOS" -t "$TXN"`
  if [[ $? -ne 0 ]]; then
      echo "$PHPCS_STRICT" >>/dev/stderr
      echo "*** Commit blocked - Please fix coding standard errors." >>/dev/stderr
      exit 1
  fi
fi

exit 0

筆記:

  • 我選擇的關鍵字為[standardcode] ,並且日志消息已轉換為小寫,以使關鍵字匹配不區分大小寫。
  • phpcs提交鈎子( /usr/bin/scripts/phpcs-svn-pre-commit )與phpcs一起打包(至少在CentOS 5.5中)。

這個想法是,開發人員可以選擇將關鍵字作為一種榮譽徽章放入其提交消息中,但是如果不適合自己的提交,則不必強迫他們檢查其代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM