php小編香蕉在處理編譯錯誤時,有時會遇到"go mod tidy"指令抱怨bazel產生的protobuf包遺失的問題。這個問題的解決方法其實很簡單,只需要在go.mod檔中手動加入對應的protobuf包依賴即可。透過執行"go mod tidy"指令來更新依賴關係,再次編譯就不會出現套件遺失的問題了。這個方法簡單又有效,能夠幫助開發者快速解決編譯錯誤,提升開發效率。
我在目錄中有一個.proto
protobuf 定義文件,我正在使用bazel 從中建立一個go 庫,如下所示(下面使用gazelle
產生的build.bazel
檔案):
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
: p>
go: finding module for package github.com/acme/icoyote/proto github.com/acme/icoyote/cmd/icoyote imports github.com/acme/icoyote/proto: no matching versions for query "latest"
任何沒有 bazel 整合的 ide(例如 vscode、沒有 bazel 插件的 goland/intellij)也會抱怨
我該怎麼辦?
之所以發生這種情況,是因為bazel 確實使用protoc
在build
檔案中的go_proto_library
規則下產生.go
文件,但僅將它們寫到bazel 下的臨時目錄中- bin
由go_library
規則使用,並且go mod tidy
似乎沒有研究bazel-bin
(可能是因為它是一個符號鏈接,但如果是的話,這些文件相對於go.mod
位置的路徑都是錯誤的)
一種選擇是透過自己呼叫protoc
手動產生go 文件,並刪除build
文件中的proto_library
和go_proto_library
規則,然後更改go_library
規則來建立生成的檔案。這是次優的,因為每次更改.proto
檔案時都必須手動重新執行protoc
(如果放入//go:generate
指令,則必須重新執行gogenerate
)。
相反,我們可以執行以下操作:
empty.go
加入到包含 .proto
檔案的目錄中。它應該看起來像這樣:package proto
ngazelle
忽略empty.go
(這樣當您執行gazelle --fix
時,它不會嘗試將go_library
規則加入到build
檔案中)。我們透過將以下內容新增至 build
檔案來實現此目的:# gazelle:exclude empty.go
這足以讓 go mod tidy
閉嘴。
這也將使 ide 停止抱怨導入,儘管在引用該套件中應該包含的任何內容時仍然會出現錯誤。如果您不想放棄 ide 而選擇帶有 bazel 插件的優秀 goland 或 intellij idea,您可能必須求助於手動 protoc
方法。也許有一種方法可以創建一個符號連結到bazel 在bazel-bin
下寫出生成的.go
檔案的位置,並強制go mod tidy
跟隨它,但我還沒有嘗試過。如果您這樣做並且有效,請分享!
以上是`go mod tidy` 抱怨 bazel 產生的 protobuf 包丟失的詳細內容。更多資訊請關注PHP中文網其他相關文章!