未发布Go模块作为go:generate依赖被go mod tidy移除的解决方案咨询
解决go:generate依赖未发布main模块被go mod tidy移除的问题
问题背景
代码里用//go:generate go run github.com/my_module/config_gen调用未发布版本的工具模块,通过提交哈希拉取后,依赖被标记为indirect,运行go mod tidy或go generate ./...时会被自动移除。尝试导入该main包会触发编译错误,临时给工具模块加空包的方案不够优雅。
可行解决方案
1. 用go mod edit强制标记为非间接依赖
直接通过命令修改go.mod,把目标依赖从间接块移到主依赖块,避免被清理:
go mod edit -require=github.com/my_module/config_gen@5b7a55227345
执行后,go.mod里的该依赖会出现在主require块中,不再带有// indirect注释,go mod tidy就不会再移除它。
2. 添加专门的工具依赖声明文件
在项目根目录创建tools.go文件,内容如下:
//go:build tools // +build tools package tools import ( _ "github.com/my_module/config_gen" )
//go:build tools和// +build tools是构建约束,确保这个文件不会被包含在主项目的编译过程中,避免导入main包导致的编译错误。- 这个文件里的导入会让Go模块将该依赖识别为项目的直接依赖,
go mod tidy会保留它,同时完全不影响主代码的编译。
3. 给工具模块发布正式版本(若可行)
如果有权限维护config_gen模块,给它打一个语义化版本标签(比如v0.1.0),然后用版本号拉取依赖:
go get github.com/my_module/config_gen@v0.1.0
这种方式最规范,依赖会被正常识别为直接依赖,后续版本更新也更方便。
内容的提问来源于stack exchange,提问作者cylon86
相关产品推荐
相关产品推荐

