Heim >Backend-Entwicklung >Golang >„Go Mod Tidy' beschwert sich, dass das von Bazel generierte Protobuf-Paket fehlt

„Go Mod Tidy' beschwert sich, dass das von Bazel generierte Protobuf-Paket fehlt

PHPz
PHPznach vorne
2024-02-10 10:09:171254Durchsuche

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

Wenn der PHP-Editor Banana mit Kompilierungsfehlern zu kämpfen hat, beschwert sich manchmal der Befehl „go mod Tidy“, dass das von Bazel generierte Protobuf-Paket fehlt. Die Lösung dieses Problems ist eigentlich sehr einfach. Sie müssen lediglich die entsprechende Protobuf-Paketabhängigkeit manuell in die Datei go.mod einfügen. Durch Ausführen des Befehls „go mod Tidy“ zum Aktualisieren der Abhängigkeiten wird durch erneutes Kompilieren das Problem des Paketverlusts beseitigt. Diese Methode ist einfach und effektiv und kann Entwicklern helfen, Kompilierungsfehler schnell zu beheben und die Entwicklungseffizienz zu verbessern.

Frageninhalt

Ich habe eine .proto protobuf 定义文件,我正在使用 bazel 从中构建一个 go 库,如下所示(下面使用 gazelle 生成的 build.bazel-Datei im Verzeichnis):

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"],
)

Ein anderer Code hängt von //icoyote/proto:proto,当我在模块中运行 go mod tidy 时,它抱怨找不到包 github.com/acme/icoyote/proto: p> ab

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"

Jede IDE ohne Bazel-Integration (z. B. vscode, goland/intellij ohne Bazel-Plugin) wird sich ebenfalls beschweren

Was soll ich tun?

Problemumgehung

Dies geschieht, weil Bazel den Pfad zum falschen Speicherort verwendetprotocbuild 文件中的 go_proto_library 规则下生成 .go 文件,但仅将它们写到 bazel 下的临时目录中 - bingo_library 规则使用,并且 go mod tidy 似乎没有研究 bazel-bin (可能是因为它是一个符号链接,但如果是的话,这些文件相对于 go.mod

Eine Möglichkeit besteht darin, es selbst anzurufen

). protoc 手动生成 go 文件,并删除 build 文件中的 proto_librarygo_proto_library 规则,然后更改 go_library 规则来构建生成的文件。这是次优的,因为每次更改 .proto 文件时都必须手动重新运行 protoc (如果将其放入 //go:generate 指令,则必须重新运行 gogenerate

Stattdessen können wir Folgendes tun:

    Legen Sie die Datei
  1. in das Verzeichnis der Datei. Es sollte so aussehen: empty.go 添加到包含 .proto
  2. package proto
    Dann sagen Sie der
  1. -Datei, dass sie Folgendes erreichen soll: ngazelle 忽略 empty.go (这样当您运行 gazelle --fix 时,它不会尝试将 go_library 规则添加到 build 文件中)。我们通过将以下内容添加到 build
  2. # gazelle:exclude empty.go
Das ist genug, um

zum Schweigen zu bringen. go mod tidy

Dadurch wird sich die IDE auch nicht mehr über Importe beschweren, obwohl Sie immer noch Fehler erhalten, wenn Sie auf alles verweisen, was im Paket enthalten sein sollte. Wenn Sie die IDE nicht zugunsten der guten Goland- oder Intellij-Idee mit dem Bazel-Plugin aufgeben möchten, müssen Sie möglicherweise auf den manuellen protoc-Ansatz zurückgreifen. Vielleicht gibt es eine Möglichkeit, unter bazel-bin einen symbolischen Link zu bazel zu erstellen und den Speicherort der generierten .go-Datei aufzuschreiben und

zu zwingen, ihr zu folgen, aber ich habe es getan Noch nicht probiert. Wenn Sie dies tun und es funktioniert, teilen Sie es bitte mit! protoc 方法。也许有一种方法可以创建一个符号链接到 bazel 在 bazel-bin 下写出生成的 .go 文件的位置,并强制 go mod tidy

Das obige ist der detaillierte Inhalt von„Go Mod Tidy' beschwert sich, dass das von Bazel generierte Protobuf-Paket fehlt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen