golangci-lint run 只检查某个子包(如 internal/auth)的正确做法是:先进入该子包所在模块根目录(含 go.mod),再执行 golangci-lint run internal/auth/...;直接在子包路径运行会因无模块上下文而报“no Go files”或静默跳过。

golangci-lint run 怎么只检查某个子包(如 internal/auth)
直接在子包路径上运行 golangci-lint run 是无效的——它会报 no Go files in current directory 或静默跳过,因为工具默认按模块边界扫描,不识别“子目录即包”的语义。
正确做法是:确保当前工作目录是该子包所在模块的根目录(即有 go.mod 的地方),再用 --path-prefix 或路径参数限定范围:
- 进入模块根目录(例如
cd ./auth-service),然后运行golangci-lint run internal/auth/...(注意末尾...表示递归子包) - 若想排除其他包、只留这一个,可在
.golangci.yml中配run.skip-dirs列出其余所有目录,但维护成本高,不推荐 -
--path-prefix仅影响输出路径显示,不改变扫描行为;真正控制范围的是传入的路径参数本身
多 module 项目中怎么只 lint 某个子模块(如 ./api/v2)
子模块必须有自己独立的 go.mod,且内容合法(含 module github.com/xxx/api/v2)。否则 golangci-lint 启动时无法解析依赖,直接失败。
必须 cd 进入该子模块目录再运行,不能从父目录用 golangci-lint run ./api/v2:
- ✅ 正确:
cd ./api/v2 && golangci-lint run - ❌ 错误:
golangci-lint run ./api/v2—— 工具会把它当普通目录,不触发模块感知逻辑 - 如果子模块没被主模块
replace或require,还需确认GO111MODULE=on和GOPROXY已设好,否则go list阶段就卡住
如何避免 lint 其他模块(比如 vendor、mocks、pb.go)
生成代码和第三方依赖不该参与 lint,否则会大量误报(如 errcheck 对 proto.Unmarshal 报错)。
最可靠的方式是在每个模块的 .golangci.yml 中显式排除:
- 用
run.skip-dirs忽略整个目录:skip-dirs: ["vendor", "mocks", "internal/gen"] - 用
run.skip-files精确忽略生成文件:skip-files: ["\.pb\.go$", "_test\.go$"](支持正则) - 别依赖
exclude-rules做路径过滤——它只对 issue 内容生效,不减少扫描量,性能无改善
CI 中怎么安全地只跑某次 PR 修改的模块
CI 不该硬编码路径,而应动态识别变更范围。golangci-lint 本身不支持 git diff 模式,得靠脚本前置提取:
- 先用
git diff --name-only origin/main...HEAD -- '*.go'获取修改的 .go 文件 - 再用
dirname提取这些文件所属的模块根目录(即找到最近的go.mod上级) - 对每个唯一模块路径,
cd进去并执行golangci-lint run --config=.golangci.yml - 关键:必须显式传
--config,否则在子目录下运行会 fallback 到默认极简集
最容易被忽略的是模块边界的识别粒度——一个 go.mod 就是一个 lint 单元,跨模块共享配置或跳过检查,都得靠路径切换来实现,没有“全局开关”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











