背景
出于团队协作开发的效率考虑,决定引入
checksytle
来规范代码风格.统一了风格,办起事来自然干净利落咯.
那引入之后有什么优点呢:
- 统一了代码风格,这样看起代码来不会觉得头疼.
- 能够
矫正
我们的撸代码规范,就跟那个坐姿优点类似... - 能够检测代码垃圾,让代码编译更快,出问题的可能性大大降低.
有啥-缺点-
呢:
- 每次提交代码,各种检测神烦,一个个调试,可能是一种煎熬吧.
- 调风格贼难受吧,选Google还是阿狸,以这两个为作为检测标准,估计你代码提都提不上去吧.
开始
接下来直接进入正题...
我们选择maven+git
的套路来对代码进行检测.
大致原理:
用git hook
,来触发checkstyle
的检测,其实现在也要不到maven.使用maven只是为了与jenkins做集成.就相当与设置两道关卡,即使你过了本地(防止有人偷渡..),还是过不了线上.
准备
我们要用到的东西有三个
- checkstyle-8.19-all.jar
- checkstyle.xml
- pre-commit
简单介绍下这几个文件的作用:
checkstyle.jar
的作用就是java做检测代码,这个是基于源代码分析,跟findbugs
不同是,findbugs
是基于字节码进行分析.这就是检测java代码的工具.
checkstyle.xml
这个就是规则(rule)的配置文件,基于xml
格式.我们可以根据语法来设定我们自已想要的代码检测规则.
常见到语法配置如下:
http://checkstyle.sourceforge.net/config.html
几种常用到代码规约
pre-commit
这个才是核心点,利用git
的生命周期做hook
,钩子触发.
在git提交的过程中,存在很多的生命周期,比如commit,pull,push,reset等等,每个动作都有对应的生命周期.
git
也很人性化的为我们提供了一些回调的hook
.每个git
仓库下面默认都会有个.git
文件夹,下面存放了很多关于git
的配置信息.
分支,配置信息,日志信息,以及最重要的hooks
,这个文件夹中就是专门存放钩子的.
hooks
文件夹中存放的都是以.sample
结尾的一些hook
样例.我们直接copy
去掉.sample
后缀就可以用了.
sudo mv pre-commit.sample pre-commit
当然这个文件就是一个脚本文件,支持很多的脚本语言,Python,prel,shell等等.默认是使用shell.因此在这个我们也使用shell.
处理的大致流程:
提交时,我们扫描所有的提交文件,过滤以.java
为后缀的文件.然后使用工具进行分析,如果检测不通过,直接退出,不让通过pre-commit
,类似拦截器功能.
脚本
#! /bin/bash
# @author:haloo#
#@func:pre-commit#
## cp ./checkstyle/pre-commit ./.git/hooks/
print 避免NPE是程序员的基本修养
print 开始style checking
wd=`pwd`
print "当前工作目录:$wd"
# check-style版本号
check_style_version="checkstyle-8.19-all.jar"
check_style_xml_name="eec-checkstyle.xml"
check_jar_path="$wd/checkstyle/$check_style_version"
check_xml_path="$wd/checkstyle/$check_style_xml_name"
## 清空temp文件
rm -f temp
is_err=0
errorCount=0
warnCount=0
## 查找add到git 缓冲区中,以.java后缀的文件
for file in `git status --porcelain | sed s/^...// | grep '\.java$'`; do
path="$wd/$file"
print "检查文件: $path"
re=`java -jar $check_jar_path -c $check_xml_path $path >> temp`
warn=`cat temp | grep "WARN"`
if [[ $warn = *"WARN"* ]];then
echo "{$warn}"
((warnCount++))
is_err=1
fi
err=`cat temp | grep "ERROR"`
if [[ $err = *"ERROR"* ]];then
echo "${err}"
((errorCount++))
is_err=1
fi
done
print "检查完成,祝你好运"
rm -f temp
if [ $is_err -ne 0 ];then
print "出现了 $errorCount 个error"
print "出现了 $warnCount 个warn"
print "请先符合style才能提交"
exit 1
fi
print "No Bug ,It is Good!!"
exit 0
脚本的存放位置
一般呢,我选择在项目根路径下,建立一个checksyle
的文件夹,然后把上面的文件丢在里面.
注意:
使用第一步,需要将pre-commit
拷贝到.git/hooks/
目录下,这样才能正确执行.当然我们还要赋予这个文件可执行权限,不然是执行不成功滴.
sudo chmod +x pre-commit
tips
在多人协作的情况下:
由于checkStyle目录下的文件内容比较大,所以pull时可能会出现自动中断的现象.具体错误如下:
RPC failed; curl 18 transfer closed with outstanding read data remaining
The remote end hung up unexpectedly
early EOF
index-pack failed
解决方案:
- 设置git的http.postBuffer
git config --global http.postBuffer 524288000
这个缓冲区主要是pull的请求缓冲区,设置大点就不会出现超时取消了.
-
更改请求方式
如果是第一次clone的话,可以选择ssh方式. -
终极大招
直接手动下算了,别折腾了..