2

PHP 5 Web アプリケーションがあり、コード標準を強制することでコード品質が向上するかどうかを判断するために、現在PHP CodeSnifferを評価しています。

私たちはコード リポジトリと展開ベースにSubversionを使用しており、SVN pre-commit フックを追加して、コミットされたすべてのファイルにコーディング標準の匂いがないようにしています。フックは技術的には機能しますが、実際に役立つには頭痛の種が多すぎます。

  1. サイトの停止を引き起こしている緊急のバグを修正する必要がある場合、最後に必要なのは、マイナーな空白のインデントの問題が原因でコミットが拒否されることです。
  2. 時には何百もの phpcs エラーを含む大量のレガシー コードがあります。現在、これらのファイルのすべての phpcs エラーを修正することは現実的ではありません。1 つの例は、ドキュメント コメントを持たない関数でいっぱいのファイルです。別の例として、クラス名が小文字で始まる場合、エラーがスローされますが、これを修正するには、コミットが必要な 10、20 以上のファイルを変更する必要があり、その後盗聴され、再帰されます...
  3. 少し大きなファイル (たとえば 4000 行のコード) がいくつかあり、phpcs はそれらをチェックするのに数分かかります。この長さだけコミットを遅らせることは容認できません。
  4. これはまだテストしていませんが、svn ブランチを実行してコミットすると、phpcs はすべてをチェックし、1000 個のファイルすべてをチェックするのに非常に長い時間がかかると思いますか?

今日、コードベース全体をリファクタリングできないことを考えると、svn pre-commit フックに phpcs を実行しないように指示する svn commit パラメータを使用する方法を知っている人はいますか?

または、説明されている頭痛を取り除く別の方法があるのでしょうか?

4

3 に答える 3

2

次のことがうまく機能し、大騒ぎせずにコードを取り込む必要性のバランスを取りながら、標準から逸脱するリリースを防ぐことがわかりました。

まず、コミットに関する「オープンアーム」ポリシーがあります。

  • すべてのコードは、機能しているかどうか、準拠しているかどうか、受け入れられます:コミットログメッセージにバグ追跡IDが含まれている限り(コミット前フックチェック)
  • 頻繁なコミットとその利点を奨励します:コラボレーション、元に戻す、バックアップ

次に、ステージング/リリースビルドに関する「くいしばられた握りこぶし」ポリシーがあります。

  • ルールからの逸脱があったとしても、ビルドは失敗します。つまり、必須の構文の正確さ、標準への準拠、コードド​​キュメント、およびすべてのテストがフライングカラーで合格します。
  • バグのあるものをリリースするのを防ぎます。バグが発生した場合は、コードの問題とビルドの問題(プロセスホール、テストの不足など)があります。

これらはすべて、phpcs(そしてもちろんphpunit、phpdocumentorなど)を使用したphingによって自動化されています。

于 2010-09-29T23:03:58.233 に答える
2

なぜ事前コミットで実行するのですか? 私はPHPUnderControlHudsonの両方を使用して、 php の「ビルド」を自動化しました... 基本的に、それらは自動化されたテスト (PHPUnit) とコード品質スキャナー (PHPCS を含む) を実行する ant/phing ビルド スクリプトを実行します (自動的に検出されます)。 . したがって、コミットを拒否することはありませんが、ビルドが失敗したことを望む人に素敵なメールを送信し、その理由 (問題のあるコードの特定の行) をリストします...

于 2010-07-30T15:48:01.757 に答える
0

優れた点があると思います。ircmaxellこの種の標準チェックは、コミット前フック以外の場所で行う必要があります。たとえば、継続的インテグレーション環境やピンチ、コミット後フックで、コミットをブロックするのではなく、提供する情報に基づいて行う必要があります。 !!

このことを念頭に置いて、私は今のところオプトインアプローチを使用することにしました。phpcsキーワードのコミットメッセージを調べて、見つかった場合は実行するようにsvnpre-commitフックを構成しました。

事前コミットフックスクリプトでは、例えば/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コミットフック( )は(少なくともCentOS 5.5では)/usr/bin/scripts/phpcs-svn-pre-commitパッケージ化されています。phpcs

開発者は、一種の名誉のバッジとしてコミットメッセージにキーワードを入れることを選択できますが、コミットに適していない場合はコードをチェックする必要はありません。

于 2010-07-31T15:04:41.157 に答える