必须通过depguard实现import包白名单/黑名单管控:先在.golangci.yml中显式启用depguard,再配置list-type、pattern及type(小写),支持全局或按cmd/、internal/等目录粒度定制规则,并需手动运行golangci-lint验证。

在Go项目中强制约束import包的使用范围,防止团队成员随意引入未经评审的第三方依赖或内部私有模块,必须通过depguard这个linter实现白名单/黑名单机制。
安装并启用depguard
确保golangci-lint已安装;若未安装,执行:go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest。
在项目根目录的.golangci.yml中,将depguard加入启用列表:
linters:
enable:
- depguard
这一步不做,后续所有配置都不会生效——【depguard默认不启用,必须显式写入enable列表】。
配置全局白名单(只允许导入指定包)
适用于严格管控依赖的场景,例如金融类核心服务,只允许使用标准库和公司内部已审计的SDK。
在.golangci.yml中添加:
linters-settings:
depguard:
list-type: allowlist
include-rules:
- pattern: ^github\.com/your-org/sdk/.*$
- pattern: ^fmt$
- pattern: ^net/http$
注意:正则表达式必须用^开头、$结尾,否则可能意外匹配到子路径;pattern: fmt这种写法会匹配所有含fmt字串的包(如github.com/x/y/fmtutil),导致误报。
配置黑名单(禁止导入特定包)
方法一:禁止全部logrus相关包(含子包)
在include-rules下添加:
- pattern: ^github\.com/sirupsen/logrus.*$
type: blacklist
方法二:禁止任意test后缀的测试辅助包(如github.com/stretchr/testify/assert被误用于生产代码)
添加规则:
- pattern: \.test$
type: blacklist
depguard对type字段大小写敏感,必须小写写成blacklist,写成Blacklist或BLACKLIST会导致该规则完全失效。
按目录粒度配置策略
第一步:在linters-settings.depguard下声明packages区块
第二步:为cmd/目录下的所有main包单独设置白名单
第三步:为internal/目录下的所有包启用更宽松的黑名单策略
完整配置示例:
packages:
- path: cmd/.*
rules:
- pattern: ^github\.com/your-org/core/.*$
- pattern: ^os/exec$
- path: internal/.*
rules:
- pattern: ^net/rpc/.*$
type: blacklist
path字段是正则,不是glob;cmd/要写成cmd/.*才能匹配cmd/api和cmd/cli等子目录。
验证配置是否生效
在项目任意.go文件中临时添加一行:import _ "github.com/sirupsen/logrus"。
运行:golangci-lint run --no-config --enable=depguard。
如果终端输出类似depguard: disallowed import of github.com/sirupsen/logrus,说明配置成功。
这一步必须手动触发一次,不能只靠IDE提示——某些编辑器插件不会实时加载depguard的自定义规则。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











