Maison > développement back-end > Golang > le corps du texte

`go mod spice` se plaint que le package protobuf généré par bazel est manquant

PHPz
Libérer: 2024-02-10 10:09:17
avant
1221 Les gens l'ont consulté

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

Lorsque l'éditeur php Banana traite des erreurs de compilation, parfois la commande "go mod spice" se plaint que le package protobuf généré par bazel est manquant. La solution à ce problème est en fait très simple. Il vous suffit d'ajouter manuellement la dépendance du package protobuf correspondante dans le fichier go.mod. Mettez à jour les dépendances en exécutant la commande "go mod spice", et il n'y aura aucun problème de perte de paquet lors de la nouvelle compilation. Cette méthode est simple et efficace et peut aider les développeurs à résoudre rapidement les erreurs de compilation et à améliorer l'efficacité du développement.

Contenu de la question

J'ai un .proto protobuf 定义文件,我正在使用 bazel 从中构建一个 go 库,如下所示(下面使用 gazelle 生成的 build.bazelfichier dans le répertoire) :

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"],
)
Copier après la connexion

Un autre code dépend de //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"
Copier après la connexion

Tout IDE sans intégration bazel (comme vscode, goland/intellij sans plugin bazel) se plaindra également

Que dois-je faire ?

Solution de contournement

Cela se produit parce que Bazel utilisele protocbuild 文件中的 go_proto_library 规则下生成 .go 文件,但仅将它们写到 bazel 下的临时目录中 - bingo_library 规则使用,并且 go mod tidy 似乎没有研究 bazel-bin (可能是因为它是一个符号链接,但如果是的话,这些文件相对于 go.mod chemin vers le mauvais emplacement)

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

Au lieu de cela, nous pouvons faire ce qui suit :

  1. Placez le fichier empty.go 添加到包含 .proto dans le répertoire du fichier. Cela devrait ressembler à ceci :
package proto
Copier après la connexion
  • Puis dites au fichier ngazelle 忽略 empty.go (这样当您运行 gazelle --fix 时,它不会尝试将 go_library 规则添加到 build 文件中)。我们通过将以下内容添加到 build de réaliser ceci :
  • # gazelle:exclude empty.go
    Copier après la connexion

    Cela suffit à faire taire go mod tidy.

    Cela empêchera également l'EDI de se plaindre des importations, même si vous obtiendrez toujours des erreurs lorsque vous référencerez tout ce qui devrait être dans le package. Si vous ne voulez pas abandonner l'IDE au profit de la bonne idée goland ou intellij avec le plugin bazel, vous devrez peut-être recourir à l'approche manuelle protoc. Il existe peut-être un moyen de créer un lien symbolique vers bazel sous bazel-bin qui écrit l'emplacement du fichier .go généré et force protoc 方法。也许有一种方法可以创建一个符号链接到 bazel 在 bazel-bin 下写出生成的 .go 文件的位置,并强制 go mod tidy à le suivre, mais je n'ai pas Je n'ai pas encore essayé. Si vous faites cela et que cela fonctionne, partagez-le !

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:stackoverflow.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!