pre-commit的规范
正如pre-commit的字面意思, 他的功能就是在commit之前做一些检测. 大多数是用来检测代码的规范,当然你可以加各种奇葩的需求,当你git commit的时候git会自动调用该脚本.
说来有意思,我见过的python程序员,要不很规范,要不很洒脱。 我是属于那种写脚本很洒脱随意,写项目比较规范的一类人。 用ide的人还好一点,尤其是那种用vim和emas的python工程师(没有配置flake8) , 这代码真是没法看呀… 哥们我真是受够了, 大家每次写那种有前端页面的项目时,代码出奇的规范(为啥? 因为前端的ide),每当写底层服务时候,也还行,但很多时候一个人负责一个单独的项目,这时候代码的规范就不好保证了…
这么多人一起开发,每个人都有自己所谓的规范,谁都不服谁,我个人也觉得pep8的标准有些地方不尽人意,比如文档说明,orm的命名规范,测试模块,所以我们有自己的pep8加强版. 配合pre-commit能很方便的检测规范我们自定义的标准.
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新. http://xiaorui.cc/?p=3829
怎么用pre-commit来检查代码?
pre-commit的步骤还是比较简单的,主要是下面这几步.
第一步
把上面配置写项目根目录下的 .pre-commit-config.yaml 文件里.
下面是我自个用的pre-commit配置, repo地址是pre-commit-hooks的地址,你也可以fork一个版本自己做一些调整,但一般来说官方提供的库包已经足够了.
#xiaorui.cc - repo: git://github.com/pre-commit/pre-commit-hooks sha: 97b88d9610bcc03982ddac33caba98bb2b751f5f hooks: - id: fix-encoding-pragma - id: autopep8-wrapper args: - --in-place - --ignore=E501,E228,E226,E261,E266,E128,E402,E241 - id: check-added-large-files - id: check-ast - id: check-case-conflict - id: check-docstring-first - id: check-json - id: pretty-format-json - id: check-merge-conflict - id: check-xml - id: check-yaml - id: debug-statements - id: detect-private-key - id: flake8 args: - --ignore=E501,E228,E226,E261,E266,E128,E402,W503 - --builtins=G,request - --jobs=1 - id: end-of-file-fixer - id: requirements-txt-fixer - id: trailing-whitespace
第二步, 安装pre-commit
# xiaorui.cc pip install pre-commit pre-commit install
第三步, 提交代码来检测pep8代码规范.
git commit -m “init project path”
git commit的时候会调用pre-commit,pre-commit又会调用flake8校验你的代码是否符合python pep8的标准. 另外pre-commit也带了自修复的功能. 但是这个修复是那种特明显的 .
我们可以在本地来测试代码pep8规范, 也就是说 不用非要git commit动作才开始检测.
flake8 . # 本地文件 pre-commit run flake8
单纯的flake8配置可以写在 ~/.config/flake8 , 也可以直接按照参数来运行检测.
# xiaorui.cc flake8 --ignore D203 \ --exclude .git,__pycache__,docs/source/conf.py,old,build,dist \ --max-complexity 10
vim ~/.config/flake8
[flake8] ignore = D203 exclude = .git, __pycache__, docs/source/conf.py, old, build, dist max-complexity = 10
注意:
关于的pre-commit配置直接可以采用pre-commit-hooks的repo地址,你也可以fork一个版本自己做一些调整,比如更贴合公司内部的规范,但一般来说官方提供的库包已经足够了。
下面是flake8的详细参数说明, 有兴趣的朋友可以看官网, http://flake8.pycqa.org/en/latest/faq.html:
# xiaorui.cc - exclude : 排除的文件或者目录,使用逗号分割,可以是直接文件名,也可以是正则匹配的文件名,默认:default: .svn,CVS,.bzr,.hg,.git,__pycache - filename : 要进行检测的文件,使用逗号分割,可以是直接文件名,也可以是正则匹配的文件名,默认:*.py - select : 默认使用的错误和警告,默认关闭 - ignore : 如果你觉得flake8太严苛了,可以适当的调整下忽略下.,如果不设置,默认:E123/E133, E226 and E241/E242 - max-line-length : 一行最大的字符长度,默认:79 - format : 错误的显示格式 - max-complexity=12 : 复杂度因子, 我一般配置12 .
如果你跟我一样很好奇git pre-commit怎么联动起来的 ? 我们可以看下当前项目.git/hoos/pre-commit文件. 是用shell写得一个小脚本,但里面的检查是python相关的. 最后通过exit值来判断是否允许commit.
# Run pre-commit if ((WHICH_RETV == 0)); then pre-commit args PRE_COMMIT_RETV=? elif ((ENV_PYTHON_RETV == 0)); then "ENV_PYTHON" -m pre_commit.mainargs PRE_COMMIT_RETV=? else python -m pre_commit.mainargs PRE_COMMIT_RETV=? fi if ((PRE_COMMIT_RETV != 0)); then retv=1 fi exitretv
其实我们也可以自己写一个 .git/hoos/pre-commit.
#!/usr/bin/python import sys from flake8.run import git_hook COMPLEXITY = 12 STRICT = True if __name__ == '__main__': sys.exit(git_hook(complexity=COMPLEXITY, strict=STRICT))
顺便说下 vim flake8的结合:
如果你有vundle vim包管理器,那么直接贴这个配置就可以了.
" Flake8 plugin for Vim. Bundle 'nvie/vim-flake8' " compiler plugin for python style checking tool. Bundle 'vim-scripts/pylint.vim' autocmd FileType python compiler pylint
END>