2

我们有一个 PHP 5 Web 应用程序,我们目前正在评估PHP CodeSniffer,以确定强制代码标准是否可以提高代码质量。

我们为我们的代码存储库和部署库使用subversion,并且我添加了一个 SVN预提交挂钩以确保所有提交的文件都没有编码标准的气味。该钩子在技术上有效,但会导致太多令人头疼的问题,实际上没有用:

  1. 如果我们必须修复导致站点中断的紧急错误,我们需要做的最后一件事是由于一些小的空格缩进问题而拒绝提交。
  2. 我们有很多遗留代码,有时会有数百个 phpcs 错误 - 现在修复这些文件中的所有 phpcs 错误是不切实际。一个例子是一个包含没有文档注释的函数的文件。另一个例子是,如果类名以小写字母开头,则会引发错误,但修复此问题可能涉及更改 10、20 多个需要提交的文件,然后将被嗅探、递归......
  3. 我们有一些文件有点大(例如 4000 行代码?),phpcs 需要几分钟来检查它们。将提交延迟这么长时间是不可接受的。
  4. 我还没有对此进行测试,但我想如果你做一个 svn 分支并提交它,phpcs 会检查所有内容并花费很长时间来检查所有 1000 个文件?

鉴于我们今天无法重构整个代码库 - 有谁知道我如何使用 svn 提交参数来告诉 svn 预提交钩子不运行 phpcs?

或者也许还有另一种方法可以消除所描述的头痛?

4

3 回答 3

2

我们发现以下方法效果很好,平衡了无需大惊小怪地获取代码的需求,但防止了与我们的标准背道而驰的版本。

首先,我们有一个关于提交的“张开双臂”政策:

  • 所有代码,无论工作与否,符合与否,都被接受:只要其提交日志消息具有错误跟踪 ID(提交前挂钩检查)
  • 鼓励频繁提交及其好处:协作、撤消、备份

然后,我们有一个关于暂存/发布构建的“握紧拳头”政策:

  • 如果有任何偏离规则(即使是微不足道的偏离),构建也会失败,这意味着:强制语法正确性、标准合规性、代码文档,并且所有测试都顺利通过
  • 防止释放任何错误。如果有问题确实通过了,那是代码的问题和构建的问题(过程漏洞、没有足够的测试等)

所有这些都是通过使用 phpcs(当然还有 phpunit、phpdocumentor 等)的 phing 实现的。

于 2010-09-29T23:03:58.233 回答
2

为什么要在预提交上运行它?我已经使用PHPUnderControlHudson来自动化 php“构建”......基本上,它们运行一个 ant/phing 构建脚本,该脚本在每次提交后运行自动化测试(PHPUnit)和代码质量扫描器(包括 PHPCS)(自动检测到) . 所以它不会拒绝提交,但它会向您希望构建失败的任何人发送一封很好的电子邮件并列出原因(违规代码的特定行)......

于 2010-07-30T15:48:01.757 回答
0

我认为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 中)。

这个想法是,开发人员可以选择将关键字作为一种荣誉徽章放在他们的提交消息中,但如果代码不适合他们的提交,他们不会被迫检查他们的代码。

于 2010-07-31T15:04:41.157 回答