繁体   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