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.
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?
Ini berlaku kerana bazel adamenggunakan laluan protoc
在 build
文件中的 go_proto_library
规则下生成 .go
文件,但仅将它们写到 bazel 下的临时目录中 - bin
由 go_library
规则使用,并且 go mod tidy
似乎没有研究 bazel-bin
(可能是因为它是一个符号链接,但如果是的话,这些文件相对于 go.mod
ke lokasi yang salah)
Satu pilihan ialah memanggilnya sendiri protoc
手动生成 go 文件,并删除 build
文件中的 proto_library
和 go_proto_library
规则,然后更改 go_library
规则来构建生成的文件。这是次优的,因为每次更改 .proto
文件时都必须手动重新运行 protoc
(如果将其放入 //go:generate
指令,则必须重新运行 gogenerate
).
Sebaliknya kita boleh melakukan perkara berikut:
empty.go
添加到包含 .proto
dalam direktori fail. Ia sepatutnya kelihatan seperti ini: package proto
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!