git pre-commit workflow

之前看了程序人生的一篇code is law,做了点小小的实践。想起在QQ群看到一个人的分享截图,于是就想将之前做的实践查到的资料删减翻译下整理成文章,如果万一有团队内部的技术分享会还是可以分享下的。

我想遵循pep8,我不想手动格式化代码,我不想每次手动执行flake8来检查,甚至我不想手动执行mypy去检查我代码。

那么有什么办法呢,作为开发,日常最常执行的操作git commit必然是其中之一,无论是通过IDE的GUI工具还是命令行的方式。

通过git提供的pre-commit的hook可以在commit的时候将代码格式化,规范检查,测试等执行完毕,而不需要工程师手动做相关的操作。流程类似这样的:

workflow

通过采用pre-commit 这个Python编写的库只需要以下几步就可以完成上述任务。

  • pipenv install -dev pre-commit
  • 编辑.pre-commit-config.yaml
  • 执行pre-commit install 以便在.git/目录中安装git hooks

比如你想用black格式化代码,flak8检查代码规范,单元测试那么例子如下:

repos:
    repo: local
    hooks:
    - id: black
      name: black
      language: system
      entry: black
      types: [python]
    - id: flake8
      name: flake8
      language: system
      entry: flake8
      types: [python]

    - id: unitest
      name: unitest
      language: system
      entry: ./test.sh
      types: [python]

repos是顶层的,每个hook都可以增加一个repo的section。
repo存储库映射告诉pre-commit从哪里获取提现实现好的hook比如这里的flake8可以改为远程的https://github.com/pre-commit/pre-commit-hooks
在上面这个例子中,由于我都在本地装了entry对应的文件,所以直接使用local
entry 表示可执行的文件或者命令
types 表示对哪些文件的更改起作用
language 表示hook是哪些语言实现的,这里直接偷懒用系统,让他自己找

有时候我们自己的标注和pep8的略有不同,那么可以在当前目录下增加 .flake8 来告诉flake8我们自己的客制化。

[flake8]
ignore = E203, E266, E501, W503, F403, F401
max-line-length = 79
max-complexity = 18
select = B,C,E,F,W,T4,B9
  • 本文章原文及本文的图片来自这里 版权归原作者所有

 上一篇
re basic guide re basic guide
Python中的re元字符总览. ^ $ * + ? { } [ ] \ | ( ) [和]指定字符类, 含义是范围,匹配一组字符 [a-z]表示所有小写字母。字符类里其他元字符不生效,在字符类里元字符被剥夺特殊性。反字符类:[^5] 匹
2019-04-26
下一篇 
ycmd server SHUT DOWN Unexpected exit code -11 ycmd server SHUT DOWN Unexpected exit code -11
What issue?The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer’). Unexpected exit code -11. Try fix./install.py -
2018-11-27
  目录