[Day 15] Oops!Golang - Linter
· 1 min read
golangci-lint
是個針對Go語言多個Linters組合而成的Linter,是Linters的大集合。 導入linter在CI流程內,已成為常態,至少會警示你的code可能會遭遇哪些問題,安全性是否有疑慮等問題。
著名使用者們
以下著名的公司也有使用golangci-lint
- AWS
- Netflix
- Arduino
- Baidu
- Eclipse Foundation
- IBM
- Istio
- Percona
- Red Hat OpenShift
- Samsung
- Serverless
- ScyllaDB
- SoundCloud
- The New York Times
- WooCart
- Xiaomi
- Yahoo
在github查詢也有上萬個收尋結果唷!
設定
golangci-lint會從當前目錄的以下路徑中查找配置文件:
- .golangci.yml
- .golangci.toml
- .golangci.json
請自行在專案內建立上述其中一個檔案 ex:.golangci.yml檔案 這裡有個官網的.golangci.example.yml 範例給各位參考
使用
本機安裝
macOS
brew install golangci/tap/golangci-lint
brew upgrade golangci/tap/golangci-lint
Docker -> 個人推薦
docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.30.0-alpine \
sh -c "golangci-lint run" -v
Linux and Windows
# binary will be $(go env GOPATH)/bin/golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0
golangci-lint --version
CI/CD
example for drone:
kind: pipeline
type: docker
name: default
steps:
- name: golangci-lint
image: golangci/golangci-lint:v1.31.0-alpine
commands:
- golangci-lint run
Oops 誤報錯誤
當你的code確認沒問題,但Linter掃錯有bug想排除怎麼辦? golangci-lint有提供 可以排除不使用lint的code方法
排除全部linters
var bad_name int //nolint
排除特定linters
var bad_name int //nolint:golint,unused
程式碼區塊排除
請在上方排除 ex: func上方 and 宣告變數上方
//nolint
func allIssuesInThisFunctionAreExcluded() *string {
// ...
}
//nolint:govet
var (
a int
b int
)
整個檔案排除特定linter
//nolint:unparam
package pkg
個人推薦使用此方法
排除特定linter,並在後方說明原因,往後review時才會快速掌握排除主因
//nolint:gocyclo // This legacy function is complex but the team too busy to simplify it
func someLegacyFunction() *string {
// ...
}