Базель с protobuf / gRPC-шлюзом / golang - начало работы

Поэтому я пытаюсь конвертировать монорепо микросервисов (C#, Go, NodeJS) в bazel. Просто пока играю с этим. Я сосредотачиваюсь на одномоментном обслуживании, чтобы начать и изолировать его как РАБОЧЕЕ МЕСТО. Сервис go - это сервис gRPC, который, очевидно, использует protobuf, grpc-gateway с protoc-gen-swagger, а также protoc-gen-gorm (этот не поддерживает bazel).

Код строится с использованием такой команды go build cmd/server/server.go

Я надеюсь получить некоторое руководство о том, как начать строить этот проект со всеми зависимостями.

Я вижу несколько правил, доступных для protobuf / Go, и мне пока не удобно просматривать их или решать, что лучше (я не могу заставить их работать из-за grpc gateway или protoc gen gorm) - https://github.com/stackb/rules_proto- https://github.com/bazelbuild/rules_go- https://github.com/stackb/rules_proto/tree/master/github.com/grpc-ecosystem/grpc-gateway

Структура кода выглядит следующим образом:

/repo
   svc1
   svc2
   svc3
       cmd/server
           BUILD.bazel 
           server.go
       pkg
           contains folders and some go files and a BUILD.bazel in each
       proto
           BUILD.bazel
           test.proto
       WORKSPACE
       BUILD.bazel

Прямо сейчас я работаю только на svc3. Позже я, вероятно, перенесу рабочее пространство в родительскую папку.

Мое рабочее пространство выглядит так:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "io_bazel_rules_go",
    sha256 = "96b1f81de5acc7658e1f5a86d7dc9e1b89bc935d83799b711363a748652c471a",
    urls = [
        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.19.2/rules_go-0.19.2.tar.gz",
        "https://github.com/bazelbuild/rules_go/releases/download/0.19.2/rules_go-0.19.2.tar.gz",
    ],
)

load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")

go_rules_dependencies()

go_register_toolchains()

http_archive(
    name = "bazel_gazelle",
    urls = [
        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/0.18.1/bazel-gazelle-0.18.1.tar.gz",
        "https://github.com/bazelbuild/bazel-gazelle/releases/download/0.18.1/bazel-gazelle-0.18.1.tar.gz",
    ],
    sha256 = "be9296bfd64882e3c08e3283c58fcb461fa6dd3c171764fcc4cf322f60615a9b",
)

load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")

gazelle_dependencies()

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository(
    name = "com_google_protobuf",
    commit = "09745575a923640154bcf307fba8aedff47f240a",
    remote = "https://github.com/protocolbuffers/protobuf",
    shallow_since = "1558721209 -0700",
)

load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")

protobuf_deps()

+ a bunch of go_repository() created by Gazelle

Запуск gazelle создал кучу файлов build.bazel для моего проекта go в каждой папке.

Рядом с.proto у меня есть сгенерированный файл build.bazel:

load("@io_bazel_rules_go//go:def.bzl", "go_library")
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")

proto_library(
    name = "svc_proto",
    srcs = ["test.proto"],
    visibility = ["//visibility:public"],
    deps = [
        # the two github below are referenced as go_repository
        "@com_github_infobloxopen_protoc_gen_gorm//options:proto_library", # not sure what to put after the colon
        "@com_github_grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:proto_library",
        "@go_googleapis//google/api:annotations_proto",
    ],
)

go_proto_library(
    name = "svc_go_proto",
    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
    importpath = "src/test/proto/v1",
    proto = ":svc_proto",
    visibility = ["//visibility:public"],
    deps = [
        "//github.com/infobloxopen/protoc-gen-gorm/options:go_default_library",
        "//github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options:go_default_library",
        "@go_googleapis//google/api:annotations_go_proto",
    ],
)

go_library(
    name = "go_default_library",
    embed = [":svc_go_proto"],
    importpath = "src/test/proto/v1",
    visibility = ["//visibility:public"],
)

Теперь вопросы:

  1. не уверены, что поместить для ссылки на другие файлы прото: "@com_github_infobloxopen_protoc_gen_gorm//options:proto_library"? и не уверен, что это лучший способ ссылаться на другие внешние библиотеки из git.
  2. если я создаю вышеупомянутое, используя bazel build //proto/v1:svc_proto, я получаю: нет такой цели '@com_github_grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:proto_library': target 'proto_library' не объявлен в пакете 'protoc-gen-swagger/ опции. Вероятно, связано с 1.
  3. я не уверен, какое правило использовать. Поскольку мне нужен grpc gateway, я думаю, мне нужно использовать исключительно https://github.com/stackb/rules_proto/tree/master/github.com/grpc-ecosystem/grpc-gateway но я не могу заставить их работать,
  4. Я использую statik ( https://github.com/rakyll/statik), чтобы упаковать файл swagger и перейти на сервер swagger. Есть ли альтернатива или, если нет, как я могу вызвать пользовательскую команду bash как часть процесса сборки в цепочке?

Таким образом, я почти уверен, что мой файл BUILD.bazel для построения прототипа и библиотеки структурирован неправильно и был бы признателен за некоторые современные рекомендации (github полон репозиториев, которые устарели, используют устаревшие правила или просто не работают).

0 ответов

Другие вопросы по тегам