成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

使用PHPCS+GIT鉤子保障團(tuán)隊(duì)開(kāi)發(fā)中代碼風(fēng)格一致性實(shí)踐

wums / 2689人閱讀

摘要:集成經(jīng)過(guò)上面的操作,代碼格式化的規(guī)則基本與的規(guī)則基本一致了,但也有一小部分不一致,所以后面還要用到和。

一、背景

筆者在6月份加入新團(tuán)隊(duì),新團(tuán)隊(duì)這邊剛組建起來(lái),基礎(chǔ)一些東西還處于待完善狀態(tài),比如筆者組內(nèi)同學(xué)約定使用PSR-2的編碼風(fēng)格規(guī)范,但是并不是所有人都嚴(yán)格按照PSR-2來(lái)提交代碼。

最大的原因就是口頭的約束力極為有限,而團(tuán)隊(duì)中大家使用的編輯器不統(tǒng)一,有使用phpstorm,也有使用VS Code更有vim,而各種編輯器都有自己的格式化規(guī)則,因此代碼風(fēng)格統(tǒng)一是個(gè)問(wèn)題;

具體一點(diǎn)來(lái)說(shuō),當(dāng)張三使用VS Code提交了一個(gè)代碼文件,李四pull代碼之后使用phpstorm進(jìn)行格式化后再提交,代碼風(fēng)格發(fā)生變化提交到服務(wù)器,張三再pull代碼,使用VS Code格式化,代碼又一次發(fā)生變化;這樣反反復(fù)復(fù)的改變,開(kāi)發(fā)同學(xué)會(huì)覺(jué)得麻煩,代碼審計(jì)同學(xué)也同樣麻煩;

在筆者上家公司的技術(shù)團(tuán)隊(duì),會(huì)由架構(gòu)組來(lái)處理類(lèi)似的問(wèn)題,于是這里筆者把上一個(gè)團(tuán)隊(duì)實(shí)現(xiàn)的方式照搬過(guò)來(lái),同樣在git的鉤子上做文章,如果有人的代碼不符合psr-2代碼風(fēng)格規(guī)范,通過(guò)git鉤子將不其commit,并且給出具體行號(hào)和具體的原因,更方便的是提供一個(gè)快速格式化的命令。

二、實(shí)現(xiàn)概要

安裝php-cs

配置php-cs

集成到編輯器

git觸發(fā)檢測(cè)

三、安裝PHP-CS

php-cs可以用來(lái)檢測(cè)代碼是否符合PSR-2規(guī)范,同時(shí)支持對(duì)不符合規(guī)范的代碼自動(dòng)格式化,讓其轉(zhuǎn)成PSR-2的編碼風(fēng)格。

3.1 安裝composer

php-cs依賴(lài)于composer,所以筆者需要先安裝composer,安裝的方法有很多種,這里提供mac操作系統(tǒng)下兩種安裝方法

brew安裝composer命令為:

brew install composer

手動(dòng)安裝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=*"

當(dāng)命令執(zhí)行完成之后,會(huì)在筆者當(dāng)前用戶的主目錄下創(chuàng)建一個(gè) .composer 目錄,在目錄中包含了筆者需要的php-cs,此時(shí)筆者可以執(zhí)行下方命令來(lái)驗(yàn)證是否安裝成功

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

當(dāng)命令執(zhí)行后,如果能看到下方的一些信息,那么就代表安裝成功

 -     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 全局使用

前面筆者使用驗(yàn)證的命令的路徑太長(zhǎng),后續(xù)如果要使用是極為不方便的,所以筆者需要將這寫(xiě)路徑加入到全局中,加入的命令如下

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

當(dāng)執(zhí)行完成之后,可以使用短命令來(lái)驗(yàn)證是否加入全局成功,可以用下方的命令

phpcs --help

執(zhí)行成功之后,返回結(jié)果應(yīng)該和上方完整路徑返回的一致。

3.4 設(shè)置默認(rèn)標(biāo)準(zhǔn)

phpcs默認(rèn)的編碼格式并不是php-cs,所以當(dāng)不指定標(biāo)準(zhǔn)的時(shí)候,檢測(cè)的結(jié)果并不準(zhǔn)確,但每次都手動(dòng)指定也挺麻煩,所以筆者可以設(shè)置一個(gè)默認(rèn)標(biāo)準(zhǔn),命令如下:

phpcs --config-set default_standard PSR2
phpcbf --config-set default_standard PSR2
3.5 PHPCS檢測(cè)

現(xiàn)在筆者可以用phpcs來(lái)真實(shí)的試驗(yàn)了,筆者先準(zhǔn)備一個(gè)PHP文件,文件里面的內(nèi)容如下代碼示例,可以看出這份代碼并不符合PSR-2的風(fēng)格規(guī)范


3.5.1 通過(guò)PHP-CS檢測(cè)編碼風(fēng)格,命令如下
phpcs /Users/tangqingsong/mycode/test.php

命令執(zhí)行完成之后,可以看到如下代碼提示,在提示中筆者能看到具體哪一行,提示級(jí)別,以及具體的提示原因

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檢測(cè) 3.6.1 自動(dòng)格式化編碼風(fēng)格命令
phpcbf /Users/tangqingsong/mycode/test.php

命令執(zhí)行完成之后,可以看到如下返回提示,處理了哪一些文件,以及類(lèi)型

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
3.6.2 再次使用PHP-CS檢測(cè)
phpcs /Users/tangqingsong/mycode/test.php

執(zhí)行完成之后,通過(guò)命令再次查看結(jié)果

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

能看到最開(kāi)始檢測(cè)有三次不合格,但現(xiàn)在只剩下一處了;這里說(shuō)一下為什么phpcbf沒(méi)有幫完全處理呢,因?yàn)閜hpcbf只能處理代碼風(fēng)格等方式,而不能幫你處理里面的命名與代碼實(shí)現(xiàn)規(guī)則,所以有少部分還需要人為去更正,但并不會(huì)太多。

四、編輯器編輯與配置

很少開(kāi)發(fā)者只使用終端就開(kāi)發(fā)代碼,通常都會(huì)用到編輯器,因此筆者也需要把phpcs和編輯器進(jìn)行結(jié)合

4.1 讓編輯器使用PSR-2標(biāo)準(zhǔn)

1.設(shè)置->code style -> PHP 中選擇風(fēng)格為 psr1/2

2.設(shè)置->languages->php->code sniffer 中設(shè)置phpcs的路徑

3.設(shè)置->Editor->Inspections展開(kāi)點(diǎn)擊右側(cè)的PHP,勾選下面的兩個(gè)PHP,選擇使用PSR2

下面還有一處,也要選中

現(xiàn)在筆者使用phpstorm的格式化,將會(huì)自動(dòng)格式化成psr-2的風(fēng)格。

4.2 集成phpcs

經(jīng)過(guò)上面的操作,phpstorm代碼格式化的規(guī)則基本與phpcs的規(guī)則基本一致了,但也有一小部分不一致,所以后面還要用到phpcs和phpcbf。

筆者如果每次都在終端去執(zhí)行phpcs風(fēng)格檢測(cè)花費(fèi)時(shí)間可不少,為了提高工作效率,可以在phpstorm集成phpcs檢測(cè)規(guī)范的功能,設(shè)置路徑:Tools->External Tools->添加-> (/usr/local/bin/phpcs ) ($FileDir$/$FileName$)

4.3 集成phpcbf

如果每次都在終端去執(zhí)行phpcbf格式化,還是會(huì)有一些麻煩,所以筆者也可以在phpstorm集成phpcbf自動(dòng)格式化功能,設(shè)置路徑:Tools->External Tools->添加-> (/usr/local/bin/phpcbf ) ($FileDir$/$FileName$)

五、GIT配置篇

當(dāng)前面一切準(zhǔn)備就緒,筆者就可以在git鉤子里面增加強(qiáng)制的策略了,git鉤子腳本存放于項(xiàng)目下 .git/hooks/ 文件夾下,按照下面的步驟筆者來(lái)添加一個(gè)commit事件。

5.1 新增鉤子文件

在你的項(xiàng)目根目錄下,使用vim命令或其他方式,新增一個(gè)文件 ./.git/hooks/pre-commit,然后把下面的腳本放進(jìn)去,之后再保存。

#!/bin/sh
PHPCS_BIN=/usr/local/bin/phpcs
PHPCS_CODING_STANDARD=PSR2
PHPCS_FILE_PATTERN=".(php)$"

FILES=$(git diff HEAD^..HEAD --stat)

if [ "$FILES" == "" ]; then
 exit 0
fi

for FILE in $FILES
do
 echo "$FILE" | egrep -q "$PHPCS_FILE_PATTERN"
 RETVAL=$?
 if [ "$RETVAL" -eq "0" ]
 then

     PHPCS_OUTPUT=$($PHPCS_BIN --standard=$PHPCS_CODING_STANDARD $FILE)
     PHPCS_RETVAL=$?

     if [ $PHPCS_RETVAL -ne 0 ];
     then
         echo $PHPCS_OUTPUT
         exit 1
     fi
 fi
done
exit 0

需要注意的是讓這個(gè)文件有可執(zhí)行權(quán)限,最直接的辦法就是設(shè)置為777,參考命令如下:

chmod 777 .git/hooks/pre-commit
5.2 本地鉤子

現(xiàn)在筆者故意讓php代碼風(fēng)格不一致,然后使用git commit來(lái)提交,看看git是否會(huì)阻止提交,以下面這份代碼為例


可以很明顯的看出來(lái),這份代碼沒(méi)有按照駝峰命名法,大括號(hào)也沒(méi)用換行的兩處問(wèn)題;把它保存在根目錄名為test.php文件,然后執(zhí)行g(shù)it commit命令,如下

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

命令執(zhí)行后,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

驗(yàn)證一下git是否commit成功,可以執(zhí)行下面的命令:

git status

返回結(jié)果如下

位于分支 develop
您的分支與上游分支 "origin/develop" 一致。

要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    新文件:   test.php

說(shuō)明筆者前面的命令只成功執(zhí)行了 git add . 而后面commit則成功阻擋了。

5.3 服務(wù)端鉤子

前面一個(gè)步驟筆者已經(jīng)成功的在本地的commit鉤子中阻擋了觸發(fā),但是任然有可能有伙伴會(huì)繞過(guò),或者新項(xiàng)目沒(méi)有部署等,導(dǎo)致可以最終提交上來(lái)的代碼還是存在不符合psr-2風(fēng)格,所以這個(gè)時(shí)候筆者就需要在服務(wù)端的push事件做一些處理。

這個(gè)時(shí)候筆者需要在服務(wù)器的鉤子事件中新增一個(gè),pre-receive 文件。

在服務(wù)端去配置的時(shí)候遇到了幾個(gè)坑,后來(lái)筆者放棄了,有興趣的可以留言或私信。

作者:湯青松

微信:songboy8888

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29195.html

相關(guān)文章

  • PHP 標(biāo)準(zhǔn)規(guī)范

    摘要:標(biāo)準(zhǔn)規(guī)范簡(jiǎn)介是的簡(jiǎn)寫(xiě),由組織制定的規(guī)范,是開(kāi)發(fā)的實(shí)踐標(biāo)準(zhǔn)。具體標(biāo)準(zhǔn)有有了統(tǒng)一編碼風(fēng)格規(guī)范,更有利于查看和學(xué)習(xí)各個(gè)框架或類(lèi)庫(kù),不不需要每次都適應(yīng)新的編碼風(fēng)格。同時(shí)在開(kāi)發(fā)團(tuán)隊(duì)內(nèi)部使用統(tǒng)一的編碼規(guī)范更有利于代碼審查版本控制團(tuán)隊(duì)內(nèi)部交流。 PHP 標(biāo)準(zhǔn)規(guī)范 PSR PSR 簡(jiǎn)介 PSR 是 PHP Standard Recommendations 的簡(jiǎn)寫(xiě),由 PHP FIG 組織制定的 PHP...

    FuisonDesign 評(píng)論0 收藏0
  • 使用GrumPHP來(lái)糾正代“毛病”

    摘要:默認(rèn)的配置不會(huì)檢測(cè)任何代碼。參數(shù)列表質(zhì)量檢測(cè)包其他有人問(wèn),你為什么要這么折磨自己呢其實(shí)像類(lèi)型代碼質(zhì)量工具,不是僅僅自己拿來(lái)玩的,在開(kāi)發(fā)人員略多的技術(shù)團(tuán)隊(duì),可以通過(guò)使用它來(lái)達(dá)到代碼規(guī)范一致,如果每個(gè)人代碼都不一樣,后果不堪設(shè)想。 showImg(https://segmentfault.com/img/bVbtfeF?w=1796&h=724); 前言 我一生的文章都會(huì)放在這里,我的博客...

    jubincn 評(píng)論0 收藏0
  • PHP 規(guī)范說(shuō)明與工具

    摘要:今天這篇分享將簡(jiǎn)單地梳理一下規(guī)范,并介紹一個(gè)代碼檢查工具,結(jié)合以及進(jìn)行實(shí)踐。目前流行的一些規(guī)范是的簡(jiǎn)寫(xiě),由組織制定的規(guī)范,是開(kāi)發(fā)的實(shí)踐標(biāo)準(zhǔn)。目前已表決通過(guò)了套標(biāo)準(zhǔn),已經(jīng)得到大部分框架的支持和認(rèn)可。 > 作為一個(gè)新手,寫(xiě)出規(guī)范的代碼也是一門(mén)必修課,除了閱讀相應(yīng)的代碼規(guī)范文檔之外,充分利用相關(guān)的工具能使得進(jìn)階之路事半功倍。今天這篇分享將簡(jiǎn)單地梳理一下 PHP 規(guī)范,并介紹一個(gè)代碼檢查工具 ...

    snowLu 評(píng)論0 收藏0
  • 配置你的Editor

    摘要:?jiǎn)⒂门渲庙?xiàng)可預(yù)覽編碼是否合格的情況,現(xiàn)在你就搭上這款插件開(kāi)始調(diào)試吧主題推薦我這里依然熱衷于其獨(dú)特的風(fēng)格以及畫(huà)面感十足一直霸占在主題排行榜的前列。進(jìn)入對(duì)應(yīng)的配置項(xiàng)可修改其。 showImg(https://segmentfault.com/img/remote/1460000009555145); 說(shuō)明 走一波配置流,莫等閑,高效快速開(kāi)發(fā),從自己的常用的工具開(kāi)始 尋找舒適的工作方式,僅...

    dcr309duan 評(píng)論0 收藏0
  • 看吧,這就是現(xiàn)代化 PHP 該有的樣子

    摘要:這大概是我沒(méi)有及早使用,或多數(shù)開(kāi)發(fā)者流連現(xiàn)狀造成的。它就是,一個(gè)的框架。行為驅(qū)動(dòng)開(kāi)發(fā)是來(lái)自測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的開(kāi)發(fā)過(guò)程。簡(jiǎn)單的說(shuō),它就是經(jīng)??赡芤惶鞄状螌⑿K代碼整合進(jìn)基礎(chǔ)代碼當(dāng)中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區(qū)協(xié)同翻譯的文章,已完成翻譯,更多信息請(qǐng)點(diǎn)擊?協(xié)同翻譯介紹?。 文章...

    Tangpj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<