Как избежать копирования зависимостей прототипа вендора на buf generate

Я тестирую grpc-gateway и пытаюсь выяснить, как лучше всего импортировать зависимости в мою службу grpc. У меня следующая структура каталога:

proto/
  api.proto
  api2.proto
third_party/
  googleapis/
    google/
      api/
        http.proto
        annotations.proto
buf.yaml
buf.gen.yaml

конфигурация buf.yaml

version: v1beta1
build:
  roots:
    - third_party/googleapis
    - third_party/grpc-gateway
    - proto

Две вещи

  • Как вы заметили, я использую buf.build для генерации прото-файлов (вы можете игнорировать этот факт, если знаете способ получше );
  • Я не копирую googleapi в прото-файлы намеренно и хотел бы хранить их где-нибудь отдельно. Я знаю, что Google рекомендует хранить все в папке proto и просто копировать зависимые файлы (например, google/api/annotations.proto), но я не фанат копировать десятки зависимостей в свой исходный код, если я могу как-то этого избежать.

У меня вопрос: всякий раз, когда я запускаю buf generate --path=./proto (обратите внимание, что путь задан как каталог), я получаю файлы googleapis pb.go, скопированные в папку proto/googleapis/. Меня это очень раздражает, и я не могу понять, что не так с моей настройкой. Если я укажу каждый файл напрямую, все в порядке (например, buf generate --path=./proto/api.proto), сторонний контент не копируется.

Есть ли способ игнорировать third_party папки на buf generate, и если нет, есть ли лучший способ управлять зависимостями grpc? Копирование файлов напрямую в каждый проект grpc не имеет для меня никакого смысла.


person Taras Matsyk    schedule 18.11.2020    source источник


Ответы (1)


Хорошо, разобрался. Обычно вы будете либо повторно использовать прото из вашей папки go/src (что имеет свои недостатки из-за обновлений репо), либо скопируете их в папку proto / dependency-x.

Я считаю, что buf использует здесь немного лучший подход, но вы должны следовать руководящим принципам построения структуры, которые вкратце таковы: structure proto files under same root, in different packets. Итак, чтобы избежать копирования, у меня должна быть следующая структура:

proto/
  api/ <- add one more level
    api.proto
    api2.proto
third_party/
  googleapis/
    google/
      api/
        http.proto
        annotations.proto
buf.yaml
buf.gen.yaml

и укажите буфер прямо в папку api следующим образом: buf generate --path=./proto/api

person Taras Matsyk    schedule 18.11.2020