【问题标题】:`go mod tidy` complains that the bazel-generated protobuf package is missing`go mod tidy` 抱怨 bazel 生成的 protobuf 包丢失
【发布时间】:2023-02-14 08:10:44
【问题描述】:

我在目录中有一个 .proto protobuf 定义文件,我正在使用 Bazel 从它构建一个 go 库,如下所示(BUILD.bazel 下面使用 gazelle 生成的文件):

load("@rules_proto//proto:defs.bzl", "proto_library")
load("@io_bazel_rules_go//go:def.bzl", "go_library")
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")

proto_library(
    name = "events_proto",
    srcs = ["events.proto"],
    visibility = ["//visibility:public"],
    deps = ["@com_google_protobuf//:timestamp_proto"],
)

go_proto_library(
    name = "proto_go_proto",
    importpath = "github.com/acme/icoyote/proto",
    proto = ":events_proto",
    visibility = ["//visibility:public"],
)

go_library(
    name = "proto",
    embed = [":proto_go_proto"],
    importpath = "github.com/acme/icoyote/proto",
    visibility = ["//visibility:public"],
)

其他一些代码依赖于//icoyote/proto:proto,当我在我的模块中运行go mod tidy时,它抱怨找不到包github.com/acme/icoyote/proto

go: finding module for package github.com/etsy/tinkerer/proto
github.com/acme/icoyote/cmd/icoyote imports
        github.com/acme/icoyote/proto: no matching versions for query "latest"

任何没有 Bazel 集成的 IDE(例如没有 Bazel 插件的 VSCode、GoLand/IntelliJ)也会抱怨

我该怎么办?

【问题讨论】:

    标签: go bazel gazelle


    【解决方案1】:

    这当然是因为 BazelBUILD 文件中的go_proto_library 规则下使用protoc 生成.go 文件,但只将它们写到bazel-bin 下的临时目录以供go_library 规则使用,并且@ 987654327@ 似乎没有查看 bazel-bin(可能是因为它是一个符号链接,但如果它查看了,这些文件相对于 go.mod 位置的路径都是错误的)

    一种选择是通过自己调用 protoc 手动生成 go 文件,并删除 BUILD 文件中的 proto_librarygo_proto_library 规则,然后更改 go_library 规则以构建生成的文件。这是次优的,因为每次更改 .proto 文件时都必须手动重新运行 protoc(如果将其放入 //go:generate 指令,则必须重新运行 go generate)。

    相反,我们可以执行以下操作:

    1. 将文件empty.go 添加到包含.proto 文件的目录。它应该是这样的:
      package proto
      
      1. 然后告诉gazelle忽略empty.go(这样当您运行gazelle --fix时它不会尝试将go_library规则添加到BUILD文件)。我们通过将以下内容添加到 BUILD 文件来做到这一点:
      # gazelle:exclude empty.go
      

      这足以让go mod tidy闭嘴。

      这也将使 IDE 停止抱怨导入,尽管在引用该包中应该包含的任何内容时仍然会出错。如果您不想为了优秀的 GoLand 或带有 Bazel 插件的 IntelliJ IDEA 而放弃您的 IDE,您可能不得不求助于手动 protoc 方法。也许有一种方法可以创建一个符号链接到 Bazel 在 bazel-bin 下写出生成的 .go 文件并强制 go mod tidy 跟随它,但我还没有尝试过。如果您这样做并且有效,请分享!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多