如何通过Gazelle移除生成的importpath中的src前缀?
我完全懂你的痛点——每次新增Go目录都要手动改importpath实在太折腾,依赖#keep也不是长久之计,更别说go-prefix还即将被移除。其实Gazelle有更优雅的原生配置方式,能直接控制生成的importpath,再也不用手动干预:
方法1:gazelle:go_root + gazelle:prefix(推荐适配你的结构)
这种方式专门针对你「所有Go代码存放在src目录」的场景,核心是告诉Gazelle你的Go模块根目录位置,以及代码实际使用的基础导入路径:
在仓库根目录的
BUILD.bazel里添加配置:load("@bazel_gazelle//:def.bzl", "gazelle") # 指定Go模块的根目录是仓库下的src文件夹 gazelle:go_root src # 设置内部代码实际使用的基础导入路径(不带src前缀) gazelle:prefix github.com/your-username/your-repo-name gazelle(name = "gazelle")确保
src目录下的go.mod模块路径和上面的gazelle:prefix一致,比如:module github.com/your-username/your-repo-name go 1.21
完成配置后重新运行Gazelle:
bazel run //:gazelle
之后Gazelle会自动把src当作模块根目录,生成的importpath会直接用你设置的前缀加上子目录路径——比如src/foo/bar包的importpath会变成github.com/your-username/your-repo-name/foo/bar,完美匹配内部代码的导入规则。
方法2:gazelle:map指令(适配复杂结构)
如果你的仓库结构更灵活,不想设置全局的go_root,可以用gazelle:map单独映射src目录的导入关系:
在
src目录下的BUILD.bazel里添加:# 将src目录映射到你的基础导入路径 gazelle:map import github.com/your-username/your-repo-name .同时在仓库根目录的
BUILD.bazel设置全局prefix:load("@bazel_gazelle//:def.bzl", "gazelle") gazelle:prefix github.com/your-username/your-repo-name gazelle(name = "gazelle")
这种方式会让Gazelle自动把src下的子包映射到指定的prefix路径下,同样不会生成带src前缀的importpath。
这两种方法都是Gazelle当前官方推荐的配置方案,完全替代了即将被移除的go-prefix,而且配置一次后,新增Go目录时Gazelle会自动生成正确的importpath,再也不用手动修改了。
内容的提问来源于stack exchange,提问作者Saurabh Garg

