版权声明:作者:汤青松 https://blog.csdn.net/u013431141/article/details/81589312

一、背景

笔者在6月份加入新团队,新团队这边刚组建起来,基础一些东西还处于待完善状态,比如笔者组内同学约定使用PSR-2的编码风格规范,但是并不是所有人都严格按照PSR-2来提交代码。

最大的原因就是口头的约束力极为有限,而团队中大家使用的编辑器不统一,有使用phpstorm,也有使用VS Code更有vim,而各种编辑器都有自己的格式化规则,因此代码风格统一是个问题;

具体一点来说,当张三使用VS Code提交了一个代码文件,李四pull代码之后使用phpstorm进行格式化后再提交,代码风格发生变化提交到服务器,张三再pull代码,使用VS Code格式化,代码又一次发生变化;这样反反复复的改变,开发同学会觉得麻烦,代码审计同学也同样麻烦;

在笔者上家公司的技术团队,会由架构组来处理类似的问题,于是这里笔者把上一个团队实现的方式照搬过来,同样在git的钩子上做文章,如果有人的代码不符合psr-2代码风格规范,通过git钩子将不其commit,并且给出具体行号和具体的原因,更方便的是提供一个快速格式化的命令。

二、实现概要

  1. 安装php-cs
  2. 配置php-cs
  3. 集成到编辑器
  4. git触发检测

三、安装PHP-CS

php-cs可以用来检测代码是否符合PSR-2规范,同时支持对不符合规范的代码自动格式化,让其转成PSR-2的编码风格。

3.1 安装composer

php-cs依赖于composer,所以笔者需要先安装composer,安装的方法有很多种,这里提供mac操作系统下两种安装方法

brew安装composer命令为:

brew install composer

手动安装composer命令为:

wget https://getcomposer.org/download/1.7.1/composer.phar && chmod 777 composer.phar  && mv composer.phar  /usr/local/bin/composer

3.2 安装PHP-CS

安装好composer之后,可以用composer快速安装php-cs,安装命令如下

composer global require "squizlabs/php_codesniffer=*"

当命令执行完成之后,会在笔者当前用户的主目录下创建一个 .composer 目录,在目录中包含了笔者需要的php-cs,此时笔者可以执行下方命令来验证是否安装成功

~/.composer/vendor/bin/phpcs  --help

当命令执行后,如果能看到下方的一些信息,那么就代表安装成功

 -     Check STDIN instead of local files and directories
 -n    Do not print warnings (shortcut for --warning-severity=0)
 -w    Print both warnings and errors (this is the default)
 -l    Local directory only, no recursion
 -s    Show sniff codes in all reports
 -a    Run interactively
 -e    Explain a standard by showing the sniffs it includes
 -p    Show progress of the run
 -q    Quiet mode; disables progress and verbose output
 -m    Stop error messages from being recorded
       (saves a lot of memory, but stops many reports from being used)-v    Print processed files
 -vv   Print ruleset and token output
 -vvv  Print sniff processing information
 -i    Show a list of installed coding standards
 -d    Set the [key] php.ini value to [value] or [true] if value is omitted

3.3 全局使用

前面笔者使用验证的命令的路径太长,后续如果要使用是极为不方便的,所以笔者需要将这写路径加入到全局中,加入的命令如下

ln -s ~/.composer/vendor/bin/phpcs /usr/local/bin/phpcs
ln -s ~/.composer/vendor/bin/phpcbf /usr/local/bin/phpcbf

当执行完成之后,可以使用短命令来验证是否加入全局成功,可以用下方的命令

phpcs --help

执行成功之后,返回结果应该和上方完整路径返回的一致。

3.4 设置默认标准

phpcs默认的编码格式并不是php-cs,所以当不指定标准的时候,检测的结果并不准确,但每次都手动指定也挺麻烦,所以笔者可以设置一个默认标准,命令如下:

phpcs --config-set default_standard PSR2
phpcbf --config-set default_standard PSR2

3.5 PHPCS检测

现在笔者可以用phpcs来真实的试验了,笔者先准备一个PHP文件,文件里面的内容如下代码示例,可以看出这份代码并不符合PSR-2的风格规范

<?phpfunction test_test(){echo 'daxia';
}test();
通过PHP-CS检测编码风格,命令如下
phpcs /Users/tangqingsong/mycode/test.php

命令执行完成之后,可以看到如下代码提示,在提示中笔者能看到具体哪一行,提示级别,以及具体的提示原因

FILE: /Users/song/mycode/test.php
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AND 1 WARNING AFFECTING 3 LINES
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1 | WARNING | [ ] A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should execute logic with side effects, but should not do both. The first symbol is
   |         |     defined on line 3 and the first side effect is on line 8.
 3 | ERROR   | [x] Opening brace should be on a new line
 8 | ERROR   | [x] Expected 1 newline at end of file; 0 found
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Time: 79ms; Memory: 4Mb

3.6 PHPCS检测

自动格式化编码风格命令
phpcbf /Users/tangqingsong/mycode/test.php

命令执行完成之后,可以看到如下返回提示,处理了哪一些文件,以及类型

PHPCBF RESULT SUMMARY
----------------------------------------------------------------------
FILE                                                  FIXED  REMAINING
----------------------------------------------------------------------
/Users/song/mycode/test.php                           2      1
----------------------------------------------------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 1 FILE
----------------------------------------------------------------------Time: 68ms; Memory: 4Mb
再次使用PHP-CS检测
phpcs /Users/tangqingsong/mycode/test.php

执行完成之后,通过命令再次查看结果

FILE: /Users/song/mycode/test.php
----------------------------------------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
----------------------------------------------------------------------------------------------------------------------------------------------
 1 | WARNING | A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should execute
   |         | logic with side effects, but should not do both. The first symbol is defined on line 3 and the first side effect is on line 9.
----------------------------------------------------------------------------------------------------------------------------------------------Time: 71ms; Memory: 4Mb

能看到最开始检测有三次不合格,但现在只剩下一处了;这里说一下为什么phpcbf没有帮完全处理呢,因为phpcbf只能处理代码风格等方式,而不能帮你处理里面的命名与代码实现规则,所以有少部分还需要人为去更正,但并不会太多。

四、编辑器编辑与配置

很少开发者只使用终端就开发代码,通常都会用到编辑器,因此笔者也需要把phpcs和编辑器进行结合

4.1 让编辑器使用PSR-2标准

  1. 设置->code style -> PHP 中选择风格为 psr1/2


2. 设置->languages->php->code sniffer 中设置phpcs的路径


3. 设置->Editor->Inspections展开点击右侧的PHP,勾选下面的两个PHP,选择使用PSR2


下面还有一处,也要选中

现在笔者使用phpstorm的格式化,将会自动格式化成psr-2的风格。

4.2 集成phpcs

经过上面的操作,phpstorm代码格式化的规则基本与phpcs的规则基本一致了,但也有一小部分不一致,所以后面还要用到phpcs和phpcbf。

笔者如果每次都在终端去执行phpcs风格检测花费时间可不少,为了提高工作效率,可以在phpstorm集成phpcs检测规范的功能,设置路径:Tools->External Tools->添加-> (/usr/local/bin/phpcs ) (FileDirFileDir/FileNameFileName)

4.3 集成phpcbf

如果每次都在终端去执行phpcbf格式化,还是会有一些麻烦,所以笔者也可以在phpstorm集成phpcbf自动格式化功能,设置路径:Tools->External Tools->添加-> (/usr/local/bin/phpcbf ) (FileDirFileDir/FileNameFileName)

五、GIT配置篇

当前面一切准备就绪,笔者就可以在git钩子里面增加强制的策略了,git钩子脚本存放于项目下 .git/hooks/ 文件夹下,按照下面的步骤笔者来添加一个commit事件。

5.1 新增钩子文件

在你的项目根目录下,使用vim命令或其他方式,新增一个文件 ./.git/hooks/pre-commit,然后把下面的脚本放进去,之后再保存。

#!/bin/sh
PHPCS_BIN=/usr/local/bin/phpcs
PHPCS_CODING_STANDARD=PSR2
PHPCS_FILE_PATTERN="\.(php)$"FILES=$(git diff HEAD^..HEAD --stat)if [ "$FILES" == "" ]; thenexit 0
fifor FILE in $FILES
doecho "$FILE" | egrep -q "$PHPCS_FILE_PATTERN"RETVAL=$?if [ "$RETVAL" -eq "0" ]thenPHPCS_OUTPUT=$($PHPCS_BIN --standard=$PHPCS_CODING_STANDARD $FILE)PHPCS_RETVAL=$?if [ $PHPCS_RETVAL -ne 0 ];thenecho $PHPCS_OUTPUTexit 1fifi
done
exit 0

需要注意的是让这个文件有可执行权限,最直接的办法就是设置为777,参考命令如下:

chmod 777 .git/hooks/pre-commit

5.2 本地钩子

现在笔者故意让php代码风格不一致,然后使用git commit来提交,看看git是否会阻止提交,以下面这份代码为例

<?phpfunction test_test(){echo 'daxia';
}test();

可以很明显的看出来,这份代码没有按照驼峰命名法,大括号也没用换行的两处问题;把它保存在根目录名为test.php文件,然后执行git commit命令,如下

 git add test.php && git commit . -m 'test'

命令执行后,git返回了如下信息,便终止了

FILE: /Users/song/mycode/work/xiaoyu/test.php
----------------------------------------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AND 1 WARNING AFFECTING 3 LINES
----------------------------------------------------------------------------------------------------------------------------------------------
 1 | WARNING | [ ] A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should
   |         |     execute logic with side effects, but should not do both. The first symbol is defined on line 3 and the first side effect
   |         |     is on line 8.
 3 | ERROR   | [x] Opening brace should be on a new line
 8 | ERROR   | [x] Expected 1 newline at end of file; 0 found
----------------------------------------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------------------------------------------------------------------------------Time: 63ms; Memory: 4Mb

验证一下git是否commit成功,可以执行下面的命令:

git status

返回结果如下

位于分支 develop
您的分支与上游分支 'origin/develop' 一致。要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)新文件:   test.php

说明笔者前面的命令只成功执行了 git add . 而后面commit则成功阻挡了。

5.3 服务端钩子

前面一个步骤笔者已经成功的在本地的commit钩子中阻挡了触发,但是任然有可能有伙伴会绕过,或者新项目没有部署等,导致可以最终提交上来的代码还是存在不符合psr-2风格,所以这个时候笔者就需要在服务端的push事件做一些处理。

这个时候笔者需要在服务器的钩子事件中新增一个,pre-receive 文件。

在服务端去配置的时候遇到了几个坑,后来笔者放弃了,有兴趣的可以留言或私信。

作者:汤青松

微信:songboy8888

使用PHPCS+GIT钩子保障团队开发中代码风格一致性实践相关推荐

  1. git 打tag_团队开发中的 Git 实践

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩! 个人原创+1博客:点击前往,查看更多 作者:欧雷链接:https://segme ...

  2. Git码云项目开发中常用分支

    Git码云项目开发中常用分支 master分支,即主分支.任何项目都必须有个这个分支.对项目进行tag或发布版本等操作,都必须在该分支上进行. develop分支,即开发分支,从master分支上检出 ...

  3. 团队开发中,xshell共享配置文件

    团队开发中,公用xshell配置文件,一次配置即可. 步骤: 1,生成公共配置文件:模仿默认配置文件生成公共配置文件.默认配置文件路径:xshell安装目录/data/Xshell/Sessions/ ...

  4. git 打tag_图文讲解,团队开发中的 Git 最佳实践

    私信我,回复:学习,获取免费学习资源包. 在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流 ...

  5. 团队开发中的 Git 实践

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文转载自:https://segmentfault.com/a/ ...

  6. 图文讲解,团队开发中的 Git 最佳实践

    在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹 ...

  7. git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践

    来源 | 欧雷 编辑 | GitHubDaily(id:GitHubDaily) 出处 | ourai.ws/posts/working-with-git-in-team/ 前言 在 2005 年的某 ...

  8. 团队开发中Git冲突解决

    正常来说我们团队协作开发过程中,冲突是常有的事,下面介绍下本人在开发中的解决办法. 冲突的主要原因就是由于我们开发人员在分支的同一位置写入了不一样的代码,然后合并到主干上导致我们冲突. 方法: 当冲突 ...

  9. 我在企业中是怎么简单使用Git的参与团队开发的?Git使用教程

    Git是一门工具,也是一门学问,你想怎样学.怎样用都取决于你: 我这里说的是我们能够入门使用Git与切实体会到Git好处的基本要求. 一.下载安装 很简单,可参看百度教程git下载安装图文教程 二.初 ...

最新文章

  1. YOLO-目标检测中计算AP、MAP方法
  2. vue双击事件_我总结了12个Vue.js开发技巧和窍门
  3. 转载:从集群计算到云计算
  4. Window_纪中_1326_单调队列
  5. 云计算教程学习入门视频课件:云计算基础服务组件讲解
  6. linux mint 引导类型,LinuxMint18配置Grub2默认启动操作系统
  7. c语言二fseek从文件头移动_C语言fseek函数
  8. 黑马 docker 学习笔记
  9. Harbor 核心服务不可用---故障排除
  10. 国一大佬也收藏的16个Python数据可视化案例(附源码)
  11. 情侣博客源码php,分享SEO WordPress的标题Title
  12. 电子邮箱是什么?注册邮箱163、tom、qq等品牌有什么好处?
  13. elasticsearch7.6 词频统计
  14. 《黄帝内经.生气通天论篇》不生病的智慧节选01
  15. python getch_python – 是否可以使用getch()来获取不同长度的输入?
  16. 仅逗oier们一笑(不定期更新中)
  17. GCC 9.4 编译error: catching polymorphic type ‘class std::bad_alloc’ by value [-Werror=catch-value=]
  18. Spring中的applicationContext.xml与SpringMVC的xxx-servl
  19. Oracle数据库update语句用法,多表批量更新对应的字段值
  20. 过孔为什么不能打焊盘上?我就想打,怎么办?

热门文章

  1. 移动app测试之怎么避免bug漏测
  2. 面对大规模系统工程,看Facebook如何处理故障排查(一)
  3. Eclipse中输入系统变量和运行参数
  4. ZeroClipboard的时代或许已经过去了
  5. iphone 如何实现全屏截图
  6. C#(.net)中的一次连接数据库执行多条sql语句
  7. ACCESS MDB数据库记录误删除恢复
  8. 机器不学习:CNN 入门讲解1-什么是卷积
  9. 一位程序员工作10年总结的13个忠告
  10. SQLite大批量插入性能优化