golangci-lint应显式配置run.skip-dirs: [vendor, third_party, deps, internal/gen]以可靠忽略第三方目录;skip-dirs是前缀匹配、递归屏蔽,需相对路径且配合modules-download-mode: readonly防意外下载。

怎么用 skip-dirs 忽略 vendor 和其他第三方目录
golangci-lint 默认跳过 vendor 目录,但这个“默认”非常脆弱——只要你在 .golangci.yml 里写了 run.skip-dirs: [](空数组)或启用了 disable-all: true 却没补 skip-dirs 块,它就会立刻失效,开始扫描 vendor/ 下成百上千个包,导致超时、内存爆满或 panic。
所以别赌默认行为,显式写死最稳:
run:
skip-dirs:
- vendor
- third_party
- deps
- internal/gen
-
skip-dirs是前缀匹配:写vendor就能同时跳过vendor/和myapp/vendor/(如果存在嵌套) - 路径必须相对于配置文件所在目录,不支持
./vendor或/vendor;后者会被当绝对路径处理失败 - 常见踩坑:把
testdata漏掉,结果vendor/foo/bar/bar_test.go被误扫,而skip-dirs是整目录屏蔽,go list | grep -v vendor这类命令做不到这点
为什么 skip-files 不适合忽略第三方代码
skip-files 用正则匹配文件名,对第三方目录完全不适用。你想跳过整个 vendor/github.com/sirupsen/logrus?没法靠文件名规则覆盖所有 .go、_test.go、/*.s 等变体。
-
skip-files适合忽略单个生成文件,比如pb.go或mock_*.go - 写
- ".*logrus.*\.go$"不仅难维护,还可能误杀你自己项目里含logrus的合法文件名 - 它不递归,只管文件名,不管路径层级;而
skip-dirs天然递归屏蔽整个子树
Go Modules 项目中 skip-dirs 必须配合 modules-download-mode
Modules 项目依赖解析更重,如果 skip-dirs 没生效,linter 可能在分析 vendor/ 时触发 go list 下载行为,意外改写 go.sum 或卡死在 proxy 请求上。
- 务必加这一行:
modules-download-mode: readonly - 否则即使
skip-dirs写对了,某些 linter(如gomodguard)仍会尝试加载模块元信息,引发权限错误或网络超时 - 多 module 仓库(monorepo)下,
skip-dirs要按子模块根路径单独设,不能只靠根配置——例如services/auth/.golangci.yml里也要声明vendor
怎么验证 skip-dirs 真的生效了
别只看有没有报错,要确认 vendor 确实没被扫描。最直接的方法是加个临时断点式检查:
golangci-lint run --debug | grep "walking"
- 正常输出里不该出现
walking dir vendor/或walking dir third_party/ - 如果看到,说明配置没加载到,检查
.golangci.yml是否拼错名(比如写成.golangci.yaml但实际是.yml),或路径是否放错位置(必须在项目根目录) - CI 中容易因工作目录切换导致配置未被发现,建议加
-c .golangci.yml显式指定
真正麻烦的是嵌套 vendor 或自定义第三方路径——它们不会被默认逻辑覆盖,必须手动列进 skip-dirs,漏一个就可能让 CI 构建突然变慢两分钟。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











