Как и где принято хранить `.proto` файлы в проекте?

Ответ

Файлы с описанием контрактов Protocol Buffers (.proto) являются ключевой частью архитектуры, основанной на gRPC, и их хранение подчиняется строгим правилам.

Основные подходы к хранению:

  1. В репозитории сервиса: Самый простой подход. .proto файлы хранятся в выделенной директории, например proto/ или api/, внутри репозитория самого сервиса. Это хорошо работает для простых проектов или когда контракт не используется другими командами.

    my-service/
    ├── api/
    │   └── my_service_v1.proto
    ├── internal/
    ├── go.mod
    └── main.go
  2. В отдельном репозитории: «Золотой стандарт» для микросервисной архитектуры. Создается отдельный Git-репозиторий, который служит "единым источником правды" для API-контрактов всех сервисов. Другие проекты подключают его как зависимость (например, через Git submodules или просто клонируя на этапе CI/CD).

Важный аспект — сгенерированный код:

С помощью компилятора protoc и плагинов (protoc-gen-go, protoc-gen-go-grpc) на основе .proto файлов генерируется Go-код (*.pb.go).

Лучшая практика — не хранить сгенерированный код в системе контроля версий (Git). Его следует генерировать автоматически:

  • Локально разработчиком с помощью go generate.
  • На этапе сборки в CI/CD пайплайне.

Это гарантирует, что код всегда соответствует актуальной версии .proto файла.

Ответ 18+ 🔞

А, слушай, про эти ваши протобуферы, блядь, файлы .proto... Это ж, ёпта, основа основ, когда на gRPC всё завязано! И хранить их надо не абы как, а по правилам, иначе потом такой пиздец начнётся, все друг другу ебучу подсунут с несовместимыми контрактами.

Куда их, блядь, девать, эти файлики?

  1. Прямо в репе сервиса, в рот меня чих-пых! Самый простой вариант, для ленивых или когда сервис один, как перст. Кидаешь их в папочку proto/ или api/ — и все дела. Но это как сидеть на бочке с порохом: если контракт начнут таскать другие сервисы, будет мясо, блядь.

    my-service/
    ├── api/
    │   └── my_service_v1.proto  # Вот он, святой грааль!
    ├── internal/
    ├── go.mod
    └── main.go
  2. В отдельном, ёбаный в рот, репозитории! Вот это уже серьёзно, золотой стандарт, блядь. Заводишь отдельную "библиотеку контрактов" — единый источник правды для всей твоей микросервисной орды. Все остальные сервисы подтягивают его как зависимость, через сабмодули или ещё как. Порядок, сука, а не бардак!

А теперь главное, блядь, про сгенерированный код!

Из этих .proto файлов компилятор protoc наклёвывает Go-код (*.pb.go). Так вот, слушай сюда и запомни раз и нахуй:

НЕ ХРАНИ ЭТОТ СГЕНЕРЁНЫЙ КОД В ГИТЕ! НИКОГДА!

Это как хранить в холодильнике уже переваренную еду — нахуя? Его надо генерить на лету, автоматически:

  • Либо локально, через go generate, когда разработчик потрогал контракт.
  • Либо прямо в CI/CD пайплайне при сборке.

Так ты гарантируешь, что весь код всегда синхронизирован с последней версией .proto файла. А то начнётся: "А у меня на машине старая версия сгенерённого кода, а контракт-то новый!" — и понеслась, ебать, волынка на три дня.