当前位置: 首页 > 后端技术 > PHP

在团队开发中使用PHPCS+GIThooks保证代码风格一致性

时间:2023-03-29 22:22:34 PHP

1.背景作者于6月份加入了一个新的团队。新团队刚刚组建,一些基础的东西还处于完善的状态,比如作者组的同学都同意使用PSR-2编码风格规范,但并不是每个人都严格按照PSR提交代码-2。最大的原因是语言限制极其有限,而且团队中大家使用的编辑器也不统一,有的用phpstorm,有的用VSCode甚至vim,各种编辑器都有自己的格式化规则,所以代码风格统一是个问题;具体来说,张三使用VSCode提交代码文件时,李四拉取代码,使用phpstorm格式化后再提交。代码风格发生变化,提交给服务器。张三再次拉取代码,用VSCode格式化,代码又变了;这样反复的改动会让开发人员觉得麻烦,代码审计的同学也会觉得麻烦;在笔者之前所在公司的技术团队中,架构团队会处理类似的问题。所以这里作者复制了之前团队的实现方法,也在githook上做文章。如果某人的代码不符合psr-2代码风格规范,commit将不会通过githook提交,具体行号和具体原因,提供快速格式化命令更方便。2.实现概述安装php-cs配置php-cs集成到编辑器git触发检测3.安装PHP-CSphp-cs可以用来检测代码是否符合PSR-2规范,支持自动格式化不符合规范的代码,让其转换为PSR-2编码风格。3.1安装composerphp-cs依赖composer,所以我需要先安装composer。安装方法有很多种。下面介绍两种mac操作系统下的安装方法。Brew安装作曲家命令是:brewinstallcomposer手动安装作曲家命令是:wgethttps://getcomposer.org/download/1.7.1/composer.phar&&chmod777composer.phar&&mvcomposer.phar/usr/local/bin/composer3.2安装PHP-CS安装composer后,可以快速使用composer安装php-cs,安装命令如下composerglobalrequire"squizlabs/php_codesniffer=*"命令执行时,会生成一个.composer目录在笔者当前用户的家目录下创建,里面包含我需要的php-cs这时候可以执行如下命令验证是否安装成功~/.composer/vendor/bin/phpcs--help当命令被执行,如果你能看到下面的一些信息,就意味着安装成功-检查STDIN而不是本地文件和目录-n不打印警告(--warning-severity=0的快捷方式)-w打印警告和错误(这是默认值)-l仅限本地目录,无递归-s在所有报告中显示嗅探代码-a以交互方式运行-e通过显示标准包含的嗅探来解释标准-p显示运行进度-q安静模式;禁用进度和详细输出-m停止记录错误消息(节省大量内存,但停止使用许多报告)-v打印处理过的文件-vv打印规则集和令牌输出-vvv打印嗅探处理信息-i显示已安装的编码标准列表-d将php.ini中的[key]值设置为[value],如果value省略则为[true]3.3全局使用之前笔者验证过的命令路径太长,后面使用起来极其不便,所以作者需要在全局添加这个写路径,添加命令如下ln-s~/.composer/vendor/bin/phpcs/usr/local/bin/phpcsln-s~/.composer/vendor/bin/phpcbf/usr/local/bin/phpcbf执行完成后可以使用短命令验证是否成功添加到全局。您可以使用下面的命令phpcs--help。执行成功后,返回结果应该和上面完整路径返回的结果一样3.4设置默认标准phpcs默认的编码格式不是php-cs,所以不指定标准时,检测结果不准确,但是每次都手动指定很麻烦,所以我可以设置一个默认标准,命令如下:phpcs--config-setdefault_standardPSR2phpcbf--config-setdefault_standardPSR23.5PHPCSdetection现在可以用phpcs来做实测了,我先准备一个PHP文件,文件内容是如下代码示例,可以看到这段代码不符合PSR-2风格规范代码风格->PHP,选择样式为psr1/22.在Settings->languages->php->codesniffer中设置phpcs的路径3.展开Settings->Editor->Inspections点击右侧的PHP,勾选这两个PHP下面,选择使用PSR2下面还有一个地方,也是选择我现在使用phpstorm的格式,会自动格式化成psr-2风格。4.2phpcs的集成经过以上操作,phpstorm的代码格式化规则与phpcs基本一致,但也有少部分不一致,所以后面会用到phpcs和phpcbf。笔者每次都在终端进行phpcs风格检测,会花费很多时间。为了提高工作效率,可以在phpstorm中集成phpcs检测规范的功能,设置路径:Tools->ExternalTools->Add->(/usr/local/bin/phpcs)($FileDir$/$FileName$)4.3集成phpcbf如果每次都在终端执行phpcbf格式化,还是会有些麻烦,所以我也可以在phpstorm中集成phpcbf自动格式化功能,设置路径:Tools->ExternalTools->Add->(/usr/local/bin/phpcbf)($FileDir$/$FileName$)5.GIT配置当一切准备就绪后,我可以在githook中添加mandatory根据策略,githook脚本存放在.git/hooks/文件夹下的项目。按照以下步骤添加提交事件。5.1添加新的钩子文件在你的项目根目录下,使用vim命令或者其他方法添加一个新的文件./.git/hooks/pre-commit,然后把下面的脚本放到里面,然后保存。#!/bin/shPHPCS_BIN=/usr/local/bin/phpcsPHPCS_CODING_STANDARD=PSR2PHPCS_FILE_PATTERN="\.(php)$"FILES=$(gitdiffHEAD^..HEAD--stat)if["$FILES"==""];然后退出0fiforFILEin$FILESdoecho"$FILE"|egrep-q"$PHPCS_FILE_PATTERN"RETVAL=$?如果["$RETVAL"-eq"0"]那么PHPCS_OUTPUT=$($PHPCS_BIN--standard=$PHPCS_CODING_STANDARD$FILE)PHPCS_RETVAL=$?如果[$PHPCS_RETVAL-ne0];然后echo$PHPCS_OUTPUTexit1fifidoneexit0需要注意的是该文件有可执行权限,最直接的方法是设置为777,参考命令如下:chmod777.git/hooks/pre-commit5.2Localhook现在故意让php代码风格不一致,然后用gitcommit提交,看看git会不会阻止提交。以下面的代码为例...”取消暂存)新文件:test.php来自作者的说明该命令仅成功执行了gitadd。随后的提交被成功阻止。5.3serverhook的上一步作者已经成功屏蔽了localcommithook中的trigger,但是还是有可能有小伙伴会绕过,或者新项目还没有部署等等,导致代码最终可以提交的还是有不一致的地方。psr-2风格,所以这时候作者需要在服务端对push事件做一些处理。这时候笔者就需要在服务端的hook事件中添加一个预接收文件。在服务器端配置的时候遇到了几个坑,后来作者就放弃了。有兴趣的可以留言或私信。作者:唐青松微信:songboy8888