Как и где принято хранить `.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 файла.