首頁 > 後端開發 > Golang > 主體

`go mod tidy` 抱怨 bazel 產生的 protobuf 包丟失

PHPz
發布: 2024-02-10 10:09:17
轉載
1247 人瀏覽過

`go mod tidy` 抱怨 bazel 生成的 protobuf 包丢失

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:

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 確實使用protocbuild 檔案中的go_proto_library 規則下產生.go 文件,但僅將它們寫到bazel 下的臨時目錄中- bingo_library 規則使用,並且go mod tidy 似乎沒有研究bazel-bin (可能是因為它是一個符號鏈接,但如果是的話,這些文件相對於go.mod 位置的路徑都是錯誤的)

一種選擇是透過自己呼叫protoc 手動產生go 文件,並刪除build 文件中的proto_librarygo_proto_library 規則,然後更改go_library 規則來建立生成的檔案。這是次優的,因為每次更改.proto 檔案時都必須手動重新執行protoc(如果放入//go:generate 指令,則必須重新執行gogenerate)。

相反,我們可以執行以下操作:

  1. 將檔案 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中文網其他相關文章!

    相關標籤:
    來源:stackoverflow.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板