对于 Gazelle,如何让它使用 WORKSPACE 中定义的 go_repository?

For Gazelle, how can I make it use go_repository defined in the WORKSPACE?

在我的 WORKSPACE 中,我为 importpath golang 定义了 go_repostitory。org/x/net。

go_repository(
   name = "org_golang_x_net",
   commit = "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec",
   importpath = "golang.org/x/net",
)

但是我运行瞪羚的时候,BUILD.Bazel添加的依赖不是@org_golang_x_net//context:go_default_library。相反,它是以下内容://golang.org/x/net/context:go_default_library

为什么gazelle会忽略定义的go_repository?有没有办法让它考虑在 WORKSPACE 中定义的 deps?

我从你的 猜测这是因为你使用了空前缀。

Gazelle 通过几个步骤解析 Go 导入到 Bazel 标签:

  1. 如果您的工作区中有 go_library 且匹配 importpath,Gazelle 将使用该库的名称。
  2. 如果导入路径低于存储库的顶级前缀,则导入将被视为 "local",因此您将获得类似 //golang.org/x/net/content:go_default_library 的标签。
    • 由于您在顶层使用了空前缀,因此此捕获将捕获每个未知的导入。
    • 这应该改进。 Gazelle 的解析器应该知道在不同目录中定义的前缀(目前,那些仅用于确定生成规则的 importpath 属性)。我已经提交 bazelbuild/bazel-gazelle#101 来解决这个问题。
  3. 如果导入不被认为是本地的,Gazelle 将根据外部模式为外部存储库或供应商目录生成标签。

现在,您可能想要向顶级构建文件添加一个指令,例如:

# gazelle:prefix __do_not_match__

这将基本上禁用第二种情况,因为不会从那里开始任何导入。你的 src 目录中仍然会有一个空前缀(在 src/BUILD.bazel 中设置 # gazelle:prefix),所以你的库仍然会有正确的 importpath 指令。不过,您可能希望将其设置为更具体的子目录。