git pre-commit workflow
之前看了程序人生的一篇code is law,做了点小小的实践。想起在QQ群看到一个人的分享截图,于是就想将之前做的实践查到的资料删减翻译下整理成文章,如果万一有团队内部的技术分享会还是可以分享下的。
我想遵循pep8,我不想手动格式化代码,我不想每次手动执行flake8来检查,甚至我不想手动执行mypy去检查我代码。
那么有什么办法呢,作为开发,日常最常执行的操作git commit必然是其中之一,无论是通过IDE的GUI工具还是命令行的方式。
通过git提供的pre-commit的hook可以在commit的时候将代码格式化,规范检查,测试等执行完毕,而不需要工程师手动做相关的操作。流程类似这样的:
通过采用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
- 本文章原文及本文的图片来自这里 版权归原作者所有