一款不錯的開源的代碼審查輔助工具
?reviewdog
地址:https://github.com/reviewdog/reviewdog
??:5.5k
語言:Go
?
在做代碼審查時,我們一般會使用工具來自動檢測到的錯誤或樣式問題,如我們可以使用各種 linter 和靜態(tài)代碼分析工具來檢測本地機器、編輯器、CI 服務(wù)中的此類問題。但靜態(tài)分析工具可能會有大量誤報,我們很難從混亂的分析結(jié)果中找到真正的問題。一些 linter 支持通過代碼注釋的減少這種誤報,但這又可能會弄亂我們的代碼。
一種解決方案是每次提交代碼時,只針對更改的地方做分析,并產(chǎn)出評審注釋。這樣我們能集中注意力,去發(fā)現(xiàn)真正的問題。而 reviewdog 正是提供這樣一個能力的工具。

reviewdog 提供了一種將代碼審查評論發(fā)布到代碼托管服務(wù)(例如 GitHub)的方法,該方法可以輕松地與任何 linter 工具集成。它使用 lint 工具的輸出,如果發(fā)現(xiàn)與要審查的補丁不同,則將它們作為評論發(fā)布。reviewdog 還支持在本地環(huán)境中運行以通過 diff 過濾 lint 工具的輸出。


可以在本地運行 reviewdog 以按差異過濾結(jié)果,也可以在 CI 服務(wù)器中運行以發(fā)布評審報告。

可以將 GitHub API 令牌存儲在 REVIEWDOG_GITHUB_API_TOKEN 環(huán)境變量中。以下是 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 中移植)。例如,如果結(jié)果格式是 {file}:{line number}:{column number}: {message},errorformat 應(yīng)該是 %f:%l:%c: %m

errorformat 還能處理更復(fù)雜的多行消息。
$ 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 功能有點困難,但在大多數(shù)情況下,我們所需要知道的只是基本的簡單項目(%f:文件,%l:行號,%c:列號,%m:消息)。

最重要的是,reviewdog ( haya14busa/errorformat ) 為主要工具提供了預(yù)定義的錯誤格式,因此在大多數(shù)情況下我們不需要編寫錯誤格式??梢栽诖颂幉榭搭A(yù)定義的錯誤格式或 reviewdog -list。
reviewdog 可以使用任何工具自動審查我們的代碼,還可以在本地運行以加快開發(fā)速度。reviewdog 幫助我們引入嚴(yán)格的 lint 工具(或經(jīng)常報告誤報結(jié)果的工具),它僅針對 Pull-Request 之類的差異檢測,而不是整個代碼庫。

reviewdog 目前支持多種語言和工具,可以參考相關(guān) repo 以按自己的需求來配置。
