Configuración de golangci-lint
golangci-lint ejecuta muchos analizadores de Go detrás de un único archivo de configuración y una única CLI.
Busca en todas las páginas de la documentación
golangci-lint ejecuta muchos analizadores de Go detrás de un único archivo de configuración y una única CLI.
Los equipos utilizan .golangci.yml para elegir linters, establecer la severidad, excluir árboles generados y mantener las ejecuciones locales alineadas con CI.
Tarjeta de referencia rápida - lista para copiar y pegar.
# Instalar versión fijada (coincidir con CI)
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.6
# Inicializar configuración interactivamente
golangci-lint config verify
# Ejecutar con la configuración del repositorio
golangci-lint run ./...
# Corregir automáticamente lo que sea seguro
golangci-lint run --fix ./...Cuándo usar esto:
go vet está limpio pero la revisión todavía detecta los mismos problemas de staticcheck.vendor/.go.work..golangci.yml de inicio para un módulo de servicio único:
run:
timeout: 5m
modules-download-mode: readonly
linters:
enable:
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- unused
- gosec
- revive
- bodyclose
disable-all: true
linters-settings:
govet:
enable-all: true
revive:
rules:
- name: exported
disabled: true
gosec:
excludes:
- G104 # ruidoso para fmt.Fprintf a http.ResponseWriter
issues:
exclude-dirs:
- vendor
- third_party
exclude-files:
- ".*\\.pb\\.go$"
- ".*_mock\\.go$"
max-issues-per-linter: 0
max-same-issues: 0Makefile:
GOLANGCI_LINT_VERSION ?= v2.1.6
.PHONY: lint
lint:
golangci-lint run ./...Trabajo de CI:
- uses: actions/setup-go@v5
with:
go-version: '1.26.x'
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v2.1.6
args: ./...Lo que esto demuestra:
disable-all: true y luego enable explícito mantiene el conjunto intencional.exclude-files omite protobuf y mocks generados.staticcheck, govet, ...).| Etapa | Linters | Objetivo |
|---|---|---|
| 1 | govet, errcheck, gosimple, ineffassign, unused | Corrección de línea base |
| 2 | staticcheck | API más profunda y código muerto |
| 3 | revive, stylecheck | Nombres y comentarios consistentes |
| 4 | gosec, bodyclose | Seguridad y fugas de recursos HTTP |
| 5 | plugins personalizados | APIs específicas de la organización |
# Raíz: valores predeterminados compartidos
run:
relative-path-mode: gomod
issues:
exclude-dirs:
- vendorservices/billing/.golangci.yml por módulo:
linters:
enable:
- gosec
linters-settings:
gosec:
severity: mediumEjecutar desde la raíz del espacio de trabajo:
golangci-lint run ./services/billing/...
golangci-lint run ./services/... # todos los módulos con go.mod//nolint:gosec // G304: ruta validada por el contrato del llamador; ver SEC-123
os.Open(userPath)Prefiere //nolint específico con ticket sobre expresiones regulares amplias de exclude-rules.
# Verificar sintaxis de configuración
golangci-lint config verify
# Listar linters habilitados
golangci-lint linters
# Depurar un solo linter
golangci-lint run --disable-all -E staticcheck ./...run.timeout: 5m y divide por módulo en la matriz de CI.internal/legacy. Solución: Exclusión por tiempo limitado con ticket de refactorización.--fix ciegamente en CI - La corrección automática puede cambiar la semántica de algunos linters. Solución: Ejecuta --fix localmente o en PRs de bots, no en commits principales silenciosos.go del módulo. Solución: go-version de CI coincide con go.mod.go vet y golangci-lint - Redundante pero aceptable; elimina go vet independiente si govet enable-all está activado.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
go vet + CLI de staticcheck | Dependencias mínimas | Quieres un único informe y exclusiones compartidas |
go/analysis multichecker personalizado | Control total, pocos linters | Necesitas 20 linters de la comunidad desde el primer día |
| Política solo de revisión | Nunca a escala | - |
Lint go:generate por paquete | Legado incremental | Reemplazando la configuración centralizada |
Raíz del repositorio para repositorios de un solo módulo.
Los monorepos a menudo usan valores predeterminados de la raíz más archivos por módulo junto a go.mod.
Ejecuta golangci-lint migrate y lee el changelog de v2.
Actualiza la versión de la acción de CI y el esquema de configuración juntos.
Sí.
Muchos errores aparecen solo en archivos _test.go (testinggoroutine, errcheck en fallos).
Usa --new-from-rev=origin/main o filtros de ruta en el flujo de trabajo para mayor velocidad.
Mantén un trabajo nocturno de escaneo completo del repositorio para detectar desviaciones.
Ejecuta golangci-lint por directorio de módulo o usa patrones de ruta ./... desde la raíz del espacio de trabajo con relative-path-mode: gomod.
revive y lll (a menudo deshabilitado por ser ruidoso) cubren esto.
La comunidad Go prefiere la legibilidad sobre los límites de columna estrictos; usa revisión para líneas exageradas.
Los presets como standard agrupan conjuntos de opiniones.
Las listas de habilitación explícitas son más claras para auditoría y documentación de incorporación.
Puede ejecutar linters gofmt y goimports.
La mayoría de los equipos todavía aplican el formato por separado para mayor velocidad y claridad.
Usa exclusiones de issues.new temporalmente o corrígelo en un sprint dedicado.
Evita exclude-rules permanentes sin propietarios.
Después de que staticcheck y gosec agoten las reglas genéricas.
Construye sobre go/analysis cuando las APIs son internas y estables.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado de GC Green Tea, modernizadores de
go fix- verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación) y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026