Ответ
Файлы с описанием контрактов Protocol Buffers (.proto) являются ключевой частью архитектуры, основанной на gRPC, и их хранение подчиняется строгим правилам.
Основные подходы к хранению:
-
В репозитории сервиса: Самый простой подход.
.protoфайлы хранятся в выделенной директории, напримерproto/илиapi/, внутри репозитория самого сервиса. Это хорошо работает для простых проектов или когда контракт не используется другими командами.my-service/ ├── api/ │ └── my_service_v1.proto ├── internal/ ├── go.mod └── main.go -
В отдельном репозитории: «Золотой стандарт» для микросервисной архитектуры. Создается отдельный 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 всё завязано! И хранить их надо не абы как, а по правилам, иначе потом такой пиздец начнётся, все друг другу ебучу подсунут с несовместимыми контрактами.
Куда их, блядь, девать, эти файлики?
-
Прямо в репе сервиса, в рот меня чих-пых! Самый простой вариант, для ленивых или когда сервис один, как перст. Кидаешь их в папочку
proto/илиapi/— и все дела. Но это как сидеть на бочке с порохом: если контракт начнут таскать другие сервисы, будет мясо, блядь.my-service/ ├── api/ │ └── my_service_v1.proto # Вот он, святой грааль! ├── internal/ ├── go.mod └── main.go -
В отдельном, ёбаный в рот, репозитории! Вот это уже серьёзно, золотой стандарт, блядь. Заводишь отдельную "библиотеку контрактов" — единый источник правды для всей твоей микросервисной орды. Все остальные сервисы подтягивают его как зависимость, через сабмодули или ещё как. Порядок, сука, а не бардак!
А теперь главное, блядь, про сгенерированный код!
Из этих .proto файлов компилятор protoc наклёвывает Go-код (*.pb.go). Так вот, слушай сюда и запомни раз и нахуй:
НЕ ХРАНИ ЭТОТ СГЕНЕРЁНЫЙ КОД В ГИТЕ! НИКОГДА!
Это как хранить в холодильнике уже переваренную еду — нахуя? Его надо генерить на лету, автоматически:
- Либо локально, через
go generate, когда разработчик потрогал контракт. - Либо прямо в CI/CD пайплайне при сборке.
Так ты гарантируешь, что весь код всегда синхронизирован с последней версией .proto файла. А то начнётся: "А у меня на машине старая версия сгенерённого кода, а контракт-то новый!" — и понеслась, ебать, волынка на три дня.