Golang структура приложения (Commandline + RESTFul API)
- Время на прочтение ~ 2 минуты
- Обновлено: 5 месяцев назад
- Создано: 2 июня 2022 г.
Golang структура приложения (Commandline + RESTFul API)
Чаще всего, прежде чем начать новый проект - мы начинаем задумываться - как организовать правильно структуру приложения, с условием того, что с проектом будут работать, другие разработчики, собираться в контейнеры и доставляться в production.
Наше приложение будет реализовывать RESTFul API + Command line (для запуска различных обработчиков работающих в фоне).
В среде разработчиков на Golang - довольно популярен проект github.com/golang-standards/project-layout. Конечно это не стандарт от разработчиков самого языка программирования - это сообщество, поэтому некоторым рекомендациям можно не следовать для своего удобства.
golang-project-layout-api-cli
Создадим пустой проект Базовые широко используемые директории
/cmd
Базовая директория для ваших main.go
файлов, в которых вы инициализируете ваши приложения.
К примеру, у нас 2 типа приложения API
и CLI
:
cmd/
├─ api/
│ ├─ main.go
├─ cli/
│ ├─ main.go
/internal
Базовая директория для приватного кода и библиотек.
К примеру:
internal/
├─ app/
│ ├─ api/
│ │ ├─ controllers/
│ │ │ ├─ ...
│ │ ├─ handlers/
│ │ │ ├─ ...
│ │ ├─ validations/
│ │ ├─ ...
│ ├─ cli/
│ │ ├─ database/
│ │ │ ├─ migrations/
│ │ │ │ ├─ ...
│ │ ├─ commands/
│ │ │ ├─ ...
├─ pkg/
│ ├─ libuuid/
│ │ ├─ ...
│ ├─ libpki/
│ │ ├─ ...
│ ├─ libjson/
│ │ ├─ ...
/pkg
Данную директорию в основном используют для кода который может импортирован другими проектами.
К примеру:
pkg/
├─ libuuid/
│ ├─ ...
├─ libpki/
│ ├─ ...
├─ libjson/
│ ├─ ...
/vendor
Эта директория для внешних зависимостей, которые могут использоваться в вашем приложении.
Чаще всего управляется вручную.
Важно заметить когда вы будете собирать приложение с такими зависимостями добавляйте опцию -mod=vendor
.
К примеру:
vendor/
├─ mycompanylib/
│ ├─ main.go
├─ myothercompanylib/
│ ├─ main.go
Также мы возьмем некоторые директории, которые рекомендует сообщество:
/init
- для размещения конфигураций инициализации CLI (supervisor.d, system.d)
/configs
- для размещения конфигурационных файлов
/deployments
- для размещения конфигурационных файлов систем контейнерной оркестрации (Docker swarm, K8s)
/build
- для размещения конфигурационных файлов CI/CD
Про другие рекомендуемые директории читайте RU - github.com/golang-standards/project-layout
Выводы
В данной статье мы раскрыли наиболее лучшую практику структуры приложения RESTFul API + Command line.
В следующей статье "обогатим" кодом и реальным использованием.