Каково назначение директории `cmd` в стандартной структуре Go-проекта?

Ответ

Директория cmd в Go-проекте предназначена для хранения исходного кода исполняемых приложений (точек входа). Эта структура является частью неофициального, но широко принятого стандарта Standard Go Project Layout.

Ключевые особенности:


  1. Разделение приложений: Если проект содержит несколько бинарных файлов (например, веб-сервер и утилиту командной строки), каждый из них размещается в своей поддиректории внутри cmd.



  2. Минимальный код: Код внутри cmd (в файлах main.go) должен быть минимальным. Его основная задача — парсинг конфигурации, инициализация зависимостей (база данных, логгер) и запуск основной бизнес-логики.



  3. Импорт внутренней логики: Основная логика приложения выносится в другие пакеты, чаще всего в директорию internal (если код не предназначен для использования другими проектами) или pkg (если код может быть переиспользован).


Пример структуры:

my-project/
├── cmd/                      # Директория с исполняемыми файлами
│   ├── api-server/           # Приложение 1: API сервер
│   │   └── main.go
│   └── cli-tool/             # Приложение 2: CLI утилита
│       └── main.go

├── internal/                 # Внутренние пакеты проекта
│   ├── handler/              # Обработчики HTTP запросов
│   ├── service/              # Бизнес-логика
│   └── repository/           # Логика работы с базой данных

├── pkg/                      # Публичные пакеты (если есть)
│   └── some-library/

└── go.mod

Преимущества такого подхода:

  • Четкая организация: Сразу видно, какие исполняемые файлы производит проект.
  • Разделение ответственности: Код в cmd отвечает за запуск, а в internal — за исполнение.
  • Масштабируемость: Легко добавлять новые приложения в проект, не затрагивая существующие.