一款不错的开源的代码审查辅助工具
共 4152字,需浏览 9分钟
·
2022-09-17 11:55
❝reviewdog
地址:https://github.com/reviewdog/reviewdog
⭐️:5.5k
语言:Go
❞
在做代码审查时,我们一般会使用工具来自动检测到的错误或样式问题,如我们可以使用各种 linter 和静态代码分析工具来检测本地机器、编辑器、CI 服务中的此类问题。但静态分析工具可能会有大量误报,我们很难从混乱的分析结果中找到真正的问题。一些 linter 支持通过代码注释的减少这种误报,但这又可能会弄乱我们的代码。
一种解决方案是每次提交代码时,只针对更改的地方做分析,并产出评审注释。这样我们能集中注意力,去发现真正的问题。而 reviewdog 正是提供这样一个能力的工具。
reviewdog 提供了一种将代码审查评论发布到代码托管服务(例如 GitHub)的方法,该方法可以轻松地与任何 linter 工具集成。它使用 lint 工具的输出,如果发现与要审查的补丁不同,则将它们作为评论发布。reviewdog 还支持在本地环境中运行以通过 diff 过滤 lint 工具的输出。
可以在本地运行 reviewdog 以按差异过滤结果,也可以在 CI 服务器中运行以发布评审报告。
可以将 GitHub API 令牌存储在 REVIEWDOG_GITHUB_API_TOKEN 环境变量中。以下是 CircleCI 的基本配置
test:
pre:
- go get github.com/haya14busa/reviewdog/cmd/reviewdog
override:
- >-
go tool vet -all -shadowstrict . 2>&1 | reviewdog -f=govet -ci="circle-ci"
为了支持任何编译器、linter 或任何工具,reviewdog 使用了 Vim 的“errorformat”功能(在 Go 中移植)。例如,如果结果格式是 {file}:{line number}:{column number}: {message}
,errorformat 应该是 %f:%l:%c: %m
errorformat
还能处理更复杂的多行消息。
$ cat testdata/sbt.in
[warn] /path/to/F1.scala:203: local val in method f is never used: (warning smaple 3)
[warn] val x = 1
[warn] ^
[warn] /path/to/F1.scala:204: local val in method f is never used: (warning smaple 2)
[warn] val x = 2
[warn] ^
[error] /path/to/F2.scala:1093: error: value ++ is not a member of Int
[error] val x = 1 ++ 2
[error] ^
[warn] /path/to/dir/F3.scala:83: local val in method f is never used
[warn] val x = 4
[warn] ^
[error] /path/to/dir/F3.scala:84: error: value ++ is not a member of Int
[error] val x = 5 ++ 2
[error] ^
[warn] /path/to/dir/F3.scala:86: local val in method f is never used
[warn] val x = 6
[warn] ^
$ errorformat "%E[%t%.%+] %f:%l: error: %m" "%A[%t%.%+] %f:%l: %m" "%Z[%.%+] %p^" "%C[%.%+] %.%#" "%-G%.%#" < testdata/sbt.in
/path/to/F1.scala|203 col 13 warning| local val in method f is never used: (warning smaple 3)
/path/to/F1.scala|204 col 7 warning| local val in method f is never used: (warning smaple 2)
/path/to/F2.scala|1093 col 15 error| value ++ is not a member of Int
/path/to/dir/F3.scala|83 col 13 warning| local val in method f is never used
/path/to/dir/F3.scala|84 col 19 error| value ++ is not a member of Int
/path/to/dir/F3.scala|86 col 13 warning| local val in method f is never used
理解整个 errorformat
功能有点困难,但在大多数情况下,我们所需要知道的只是基本的简单项目(%f
:文件,%l
:行号,%c
:列号,%m
:消息)。
最重要的是,reviewdog ( haya14busa/errorformat ) 为主要工具提供了预定义的错误格式,因此在大多数情况下我们不需要编写错误格式。可以在此处查看预定义的错误格式或 reviewdog -list
。
reviewdog 可以使用任何工具自动审查我们的代码,还可以在本地运行以加快开发速度。reviewdog 帮助我们引入严格的 lint 工具(或经常报告误报结果的工具),它仅针对 Pull-Request 之类的差异检测,而不是整个代码库。
reviewdog 目前支持多种语言和工具,可以参考相关 repo 以按自己的需求来配置。