golangci-lint默认按优先级顺序向上查找.golangci.yml、.golangci.yaml、.golangci.toml、.golangci.json,找到即停;必须置于项目根目录(与go.mod同级),子目录中无效;可通过-c参数或GOLANGCI_LINT_CONFIG环境变量强制指定路径。

当你在终端执行 golangci-lint run 却没看到预期的检查结果,很可能是因为工具根本没找到你的配置文件——它不会默认读取当前目录下的任意命名文件,而是按严格顺序向上查找特定名称的配置,漏掉一个就退回到内置默认规则。
配置文件查找路径与优先级
golangci-lint 启动时,从当前工作目录开始,逐级向上遍历父目录,直到根目录(/ 或 C:\),依次检查是否存在以下文件(按此顺序):
1. .golangci.yml → 2. .golangci.yaml → 3. .golangci.toml → 4. .golangci.json
只要找到其中任一文件,立即停止搜索并加载;后续路径中的同名文件被完全忽略。这意味着如果你在 project/sub/pkg 目录下运行命令,而 project/.golangci.yml 和 project/sub/.golangci.yaml 同时存在,只会加载 project/.golangci.yml,哪怕它内容为空或只有注释。
立即学习“go语言免费学习笔记(深入)”;
【必须放在项目根目录才能生效】 如果你把 .golangci.yml 放在 cmd/ 或 internal/ 子目录里,它永远不会被识别——工具根本不进子目录找。
手动指定配置文件的两种方式
方法一:用 -c 参数强制指定路径
golangci-lint run -c ./configs/my-lint.yml
这会跳过所有自动查找逻辑,直接读取你给的绝对或相对路径。注意:路径必须存在且可读,否则报错退出,不会 fallback 到默认行为。
方法二:通过环境变量 GOLANGCI_LINT_CONFIG
GOLANGCI_LINT_CONFIG=./.golangci.dev.yml golangci-lint run
这个变量值优先级高于 -c 参数和自动查找——只要设置了,就只认这个路径。适合 CI 环境中切换不同配置,比如测试分支用宽松规则、主干用严格规则。
常见失效场景与验证手段
执行 golangci-lint run --help 查看当前解析到的配置路径:
输出中会明确显示类似 Config file: /path/to/project/.golangci.yml 的行。如果显示 Config file: (default),说明所有查找路径都失败,正在使用硬编码默认规则(启用约 30+ linter,但关闭了 errcheck 等关键项)。
用 golangci-lint run --debug 可看到完整查找过程日志,例如:
DEBUG Found config file at /home/user/myproj/.golangci.yml
DEBUG Using config file: /home/user/myproj/.golangci.yml
如果出现 DEBUG No config file found,立刻检查文件名拼写(yml 不是 yaml)、隐藏文件属性(macOS Finder 默认不显示以 . 开头的文件)、Git 忽略状态(.gitignore 里误加了 .golangci.*)。


















