Rumah  >  Artikel  >  pembangunan bahagian belakang  >  `go mod tidy` mengadu bahawa pakej protobuf yang dijana oleh bazel hilang

`go mod tidy` mengadu bahawa pakej protobuf yang dijana oleh bazel hilang

PHPz
PHPzke hadapan
2024-02-10 10:09:171220semak imbas

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

Apabila editor php Banana menghadapi ralat kompilasi, kadangkala arahan "go mod tidy" mengadu bahawa pakej protobuf yang dihasilkan oleh bazel hilang. Penyelesaian kepada masalah ini sebenarnya sangat mudah Anda hanya perlu menambah kebergantungan pakej protobuf yang sepadan secara manual dalam fail go.mod. Kemas kini kebergantungan dengan melaksanakan arahan "go mod tidy", dan tidak akan ada masalah kehilangan pakej apabila menyusun semula. Kaedah ini mudah dan berkesan, serta boleh membantu pembangun dengan cepat menyelesaikan ralat penyusunan dan meningkatkan kecekapan pembangunan.

Kandungan soalan

Saya ada .proto protobuf 定义文件,我正在使用 bazel 从中构建一个 go 库,如下所示(下面使用 gazelle 生成的 build.bazel fail dalam direktori):

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

Sesetengah kod lain bergantung pada //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"

Mana-mana IDE tanpa integrasi bazel (seperti vscode, goland/intellij tanpa pemalam bazel) juga akan mengeluh

Apa yang perlu saya lakukan?

Penyelesaian

Ini berlaku kerana bazel adamenggunakan laluan protocbuild 文件中的 go_proto_library 规则下生成 .go 文件,但仅将它们写到 bazel 下的临时目录中 - bingo_library 规则使用,并且 go mod tidy 似乎没有研究 bazel-bin (可能是因为它是一个符号链接,但如果是的话,这些文件相对于 go.mod ke lokasi yang salah)

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

Sebaliknya kita boleh melakukan perkara berikut:

  1. Letakkan fail empty.go 添加到包含 .proto dalam direktori fail. Ia sepatutnya kelihatan seperti ini:
package proto
  1. Kemudian beritahu ngazelle 忽略 empty.go (这样当您运行 gazelle --fix 时,它不会尝试将 go_library 规则添加到 build 文件中)。我们通过将以下内容添加到 build fail untuk mencapai ini:
# gazelle:exclude empty.go

Itu sudah cukup untuk membuat go mod tidy diam.

Ini juga akan membuatkan IDE berhenti merungut tentang import, walaupun anda masih akan mendapat ralat semasa merujuk apa-apa yang sepatutnya ada dalam pakej. Jika anda tidak mahu meninggalkan IDE demi idea goland atau intellij yang baik dengan pemalam bazel, anda mungkin perlu menggunakan pendekatan protoc manual. Mungkin ada cara untuk mencipta symlink ke bazel di bawah bazel-bin dan menulis lokasi fail .go yang dihasilkan dan memaksa protoc 方法。也许有一种方法可以创建一个符号链接到 bazel 在 bazel-bin 下写出生成的 .go 文件的位置,并强制 go mod tidy untuk mengikutinya, tetapi saya tidak tahu belum Cuba. Jika anda melakukan ini dan ia berkesan, sila kongsi!

Atas ialah kandungan terperinci `go mod tidy` mengadu bahawa pakej protobuf yang dijana oleh bazel hilang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam