backend/LINTING.md

237 lines
4.6 KiB
Markdown
Raw Normal View History

# 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)