237 lines
4.6 KiB
Markdown
237 lines
4.6 KiB
Markdown
# Go Linting 配置說明
|
||
|
||
本項目使用現代化的 Go linting 工具來確保代碼質量和風格一致性。
|
||
|
||
## 工具介紹
|
||
|
||
### golangci-lint
|
||
- **現代化的 Go linter 聚合工具**,整合了多個 linter
|
||
- 比傳統的 `golint` 更快、更全面
|
||
- 支持並行執行和緩存
|
||
- 配置文件:`.golangci.yml`
|
||
|
||
## 安裝
|
||
|
||
### 安裝 golangci-lint
|
||
|
||
```bash
|
||
# macOS
|
||
brew install golangci-lint
|
||
|
||
# Linux
|
||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2
|
||
|
||
# Windows
|
||
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2
|
||
```
|
||
|
||
### 安裝其他工具
|
||
|
||
```bash
|
||
# 格式化工具
|
||
go install mvdan.cc/gofumpt@latest
|
||
go install golang.org/x/tools/cmd/goimports@latest
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
### Makefile 命令
|
||
|
||
```bash
|
||
# 基本代碼檢查
|
||
make lint
|
||
|
||
# 自動修復可修復的問題
|
||
make lint-fix
|
||
|
||
# 詳細輸出
|
||
make lint-verbose
|
||
|
||
# 只檢查新問題(與 main 分支比較)
|
||
make lint-new
|
||
|
||
# 格式化代碼
|
||
make fmt
|
||
```
|
||
|
||
### 直接使用 golangci-lint
|
||
|
||
```bash
|
||
# 基本檢查
|
||
golangci-lint run
|
||
|
||
# 自動修復
|
||
golangci-lint run --fix
|
||
|
||
# 檢查特定目錄
|
||
golangci-lint run ./pkg/...
|
||
|
||
# 詳細輸出
|
||
golangci-lint run -v
|
||
|
||
# 只顯示新問題
|
||
golangci-lint run --new-from-rev=main
|
||
```
|
||
|
||
## 配置說明
|
||
|
||
### 啟用的 Linters
|
||
|
||
我們的配置啟用了以下 linter 類別:
|
||
|
||
#### 核心檢查
|
||
- `errcheck`: 檢查未處理的錯誤
|
||
- `gosimple`: 簡化代碼建議
|
||
- `govet`: 檢查常見錯誤
|
||
- `staticcheck`: 靜態分析
|
||
- `typecheck`: 類型檢查
|
||
- `unused`: 檢查未使用的變量和函數
|
||
|
||
#### 代碼質量
|
||
- `cyclop`: 循環複雜度檢查
|
||
- `dupl`: 代碼重複檢測
|
||
- `funlen`: 函數長度檢查
|
||
- `gocognit`: 認知複雜度檢查
|
||
- `gocyclo`: 循環複雜度檢查
|
||
- `nestif`: 嵌套深度檢查
|
||
|
||
#### 格式化
|
||
- `gofmt`: 格式化檢查
|
||
- `gofumpt`: 更嚴格的格式化
|
||
- `goimports`: 導入排序
|
||
|
||
#### 命名和風格
|
||
- `goconst`: 常量檢查
|
||
- `gocritic`: 代碼評論
|
||
- `gomnd`: 魔術數字檢查
|
||
- `stylecheck`: 風格檢查
|
||
- `varnamelen`: 變量名長度檢查
|
||
|
||
#### 安全
|
||
- `gosec`: 安全檢查
|
||
|
||
#### 錯誤處理
|
||
- `errorlint`: 錯誤處理檢查
|
||
- `nilerr`: nil 錯誤檢查
|
||
- `wrapcheck`: 錯誤包裝檢查
|
||
|
||
### 配置文件結構
|
||
|
||
```yaml
|
||
# .golangci.yml
|
||
run:
|
||
timeout: 5m
|
||
skip-dirs: [vendor, .git, bin, build, dist, tmp]
|
||
skip-files: [".*\\.pb\\.go$", ".*\\.gen\\.go$"]
|
||
|
||
linters:
|
||
disable-all: true
|
||
enable: [errcheck, gosimple, govet, ...]
|
||
|
||
linters-settings:
|
||
# 各個 linter 的詳細配置
|
||
|
||
issues:
|
||
# 問題排除規則
|
||
exclude-rules:
|
||
- path: _test\.go
|
||
linters: [gomnd, funlen, dupl]
|
||
```
|
||
|
||
## IDE 整合
|
||
|
||
### VS Code
|
||
項目包含 `.vscode/settings.json` 配置:
|
||
- 自動使用 golangci-lint 進行檢查
|
||
- 保存時自動格式化
|
||
- 使用 gofumpt 作為格式化工具
|
||
|
||
### GoLand/IntelliJ
|
||
1. 安裝 golangci-lint 插件
|
||
2. 在設置中指向項目的 `.golangci.yml` 文件
|
||
|
||
## CI/CD 整合
|
||
|
||
### GitHub Actions
|
||
項目包含 `.github/workflows/ci.yml`:
|
||
- 自動運行測試
|
||
- 執行 golangci-lint 檢查
|
||
- 安全掃描
|
||
- 依賴檢查
|
||
|
||
### 本地 Git Hooks
|
||
可以設置 pre-commit hook:
|
||
|
||
```bash
|
||
#!/bin/sh
|
||
# .git/hooks/pre-commit
|
||
make lint
|
||
```
|
||
|
||
## 常見問題
|
||
|
||
### 1. 如何忽略特定的檢查?
|
||
|
||
在代碼中使用註釋:
|
||
```go
|
||
//nolint:gosec // 忽略安全檢查
|
||
password := "hardcoded"
|
||
|
||
//nolint:lll // 忽略行長度檢查
|
||
url := "https://very-long-url-that-exceeds-line-length-limit.com/api/v1/endpoint"
|
||
```
|
||
|
||
### 2. 如何為測試文件設置不同的規則?
|
||
|
||
配置文件中已經為測試文件設置了特殊規則:
|
||
```yaml
|
||
exclude-rules:
|
||
- path: _test\.go
|
||
linters: [gomnd, funlen, dupl, lll, goconst]
|
||
```
|
||
|
||
### 3. 如何調整複雜度閾值?
|
||
|
||
在 `.golangci.yml` 中調整:
|
||
```yaml
|
||
linters-settings:
|
||
cyclop:
|
||
max-complexity: 15 # 調整循環複雜度
|
||
funlen:
|
||
lines: 100 # 調整函數行數限制
|
||
statements: 50 # 調整語句數限制
|
||
```
|
||
|
||
### 4. 性能優化
|
||
|
||
- 使用緩存:`golangci-lint cache clean` 清理緩存
|
||
- 只檢查修改的文件:`--new-from-rev=main`
|
||
- 並行執行:默認已啟用
|
||
|
||
## 升級和維護
|
||
|
||
定期更新 golangci-lint:
|
||
```bash
|
||
# 檢查版本
|
||
golangci-lint version
|
||
|
||
# 升級到最新版本
|
||
brew upgrade golangci-lint # macOS
|
||
# 或重新下載安裝腳本
|
||
```
|
||
|
||
定期檢查配置文件的新選項和 linter:
|
||
```bash
|
||
# 查看所有可用的 linter
|
||
golangci-lint linters
|
||
|
||
# 查看配置幫助
|
||
golangci-lint config -h
|
||
```
|
||
|
||
## 參考資源
|
||
|
||
- [golangci-lint 官方文檔](https://golangci-lint.run/)
|
||
- [Go 代碼風格指南](https://github.com/golang/go/wiki/CodeReviewComments)
|
||
- [Effective Go](https://golang.org/doc/effective_go.html)
|