直接在目标子目录下执行golangci-lint run,而非从根目录调用golangci-lint run ./subdir;需确保该目录有go.mod且存在有效.golangci.yml(或能向上查找到),否则报“no Go files”或“cannot find module”。

golangci-lint run 时怎么只扫某个子目录?
直接在目标目录下执行 golangci-lint run,而不是从项目根目录用 golangci-lint run ./subdir ——后者会让工具把 ./subdir 当作普通路径处理,不触发模块感知和配置自动查找逻辑。
实操建议:
- cd 进入你要扫描的目录(比如
cd internal/api),再运行golangci-lint run - 确保该目录下有
go.mod(或属于某个已识别的 Go module),否则会报no Go files或cannot find module - 若该目录无独立
.golangci.yml,工具会向上查找;但别指望父级配置“自动适配”子目录路径——skip-dirs和skip-files中的路径始终相对于配置文件所在位置
想排除 vendor、testdata 等目录,但配置没生效?
不是“默认跳过 vendor 就万事大吉”,而是默认行为极易被配置覆盖。最稳妥的做法是显式写死 run.skip-dirs。
常见失效原因:
立即学习“go语言免费学习笔记(深入)”;
-
run.skip-dirs: [](空数组):覆盖默认值,vendor 会被重新扫描 -
disable-all: true启用后,没补run.skip-dirs块:默认跳过逻辑完全失效 - 路径写成
- ./vendor或- src/vendor:golangci-lint 只认相对于.golangci.yml文件位置的纯目录名,如vendor、docs - 多 module 项目中,子模块没放自己的
.golangci.yml,又没用-c指定配置:可能 fallback 到极简默认集(仅govet/errcheck)
如何用 skip-files 精确忽略特定文件?
run.skip-files 支持 glob 风格通配符(* 和 **),但匹配的是文件路径的“后缀部分”,不是完整绝对路径。
典型用法:
-
- ".*_test.go":跳过所有以_test.go结尾的文件(注意引号,避免 YAML 解析错误) -
- "cmd/myapp/main.go":跳过指定路径下的具体文件(路径相对于配置文件所在目录) -
- "**/generated/*.go":跳过任意深度的generated子目录下所有.go文件 - 别写
- "*/main.go"试图匹配所有 main.go:它只会匹配形如a/main.go的一级子目录,不匹配cmd/main.go或internal/app/main.go
CI 中扫描子模块时路径错乱、报告丢失?
GitHub Actions 或 Jenkins 里跑 golangci-lint,最容易出问题的不是规则本身,而是输出格式与路径解析脱节。
关键检查点:
- 命令行必须显式加
--out-format=github-actions(即使.golangci.yml里写了output.formats,命令行不指定就无效) -
format: github-actions不支持写入文件,只能输出到 stdout;想存报告得靠 shell 重定向:golangci-lint run --out-format=github-actions > report.txt - CI 脚本中执行前先确认当前工作目录是否为子模块根目录:
pwd和ls go.mod缺一不可 - 用
golangci-lint run -c .golangci.yml显式指定配置,避免因目录层级导致配置未加载
路径相关的问题往往不会报错,只会静默跳过或输出空结果——尤其当 .golangci.yml 缩进错位、文件名拼错(比如 .golangci.yaml)、或放在了 src/ 下却没和 go.mod 同级时,工具根本不会告诉你配置失效。


















