Per decision to use common industry practice now and tune later: - structures: standard layouts (go cmd/internal/pkg, python src-layout, rust cargo, ts pnpm workspaces, kotlin Gradle modules, swift SwiftPM) - linters: default rulesets (golangci base, clippy -D warnings, ruff+mypy, typescript-eslint+prettier, ktlint+detekt, swiftlint+swiftformat) - test runners: TS=vitest; coverage soft targets (~70-80%) marked '(пороги уточним)' - swift deps: SwiftPM (Package.resolved), CocoaPods legacy-only - reworded intros: values are industry defaults to be tuned, no raw TODO markers left Verified: no TODO markers remain in *-standards; all six skills load via pi.
64 lines
4.1 KiB
Markdown
64 lines
4.1 KiB
Markdown
---
|
||
name: go-standards
|
||
description: Используй при написании, ревью и проверке кода на Go в наших сервисах — структура сервиса, запуск линтеров и тестов, формат коммитов и merge request. Применяй всегда, когда пишешь или правишь Go-код, готовишь MR, а также в командах /bugfix, /feature и /review.
|
||
---
|
||
|
||
# Стандарты Go
|
||
|
||
Наш основной стек — **Go**. Скилл описывает, как писать, проверять и оформлять код.
|
||
Реалистичные общепринятые дефолты приведены ниже; то, что специфично для компании,
|
||
заполнено дефолтами индустрии — тюним под M.Video позже.
|
||
|
||
## Структура сервиса
|
||
|
||
Ориентир (уточняется под компанию):
|
||
|
||
```
|
||
cmd/<service>/main.go # точка входа
|
||
internal/ # приватный код сервиса
|
||
<domain>/ # доменные пакеты
|
||
pkg/ # переиспользуемый публичный код (если есть)
|
||
api/ # спецификации API (proto/openapi)
|
||
```
|
||
|
||
> Ориентир по индустрии: `cmd/` + `internal/` + `pkg/`. Эталон под M.Video уточним позже.
|
||
|
||
## Линтеры
|
||
|
||
- Форматирование: `gofmt -l -w .` и `goimports -w .` — код должен быть отформатирован.
|
||
- Статический анализ: `go vet ./...`.
|
||
- Основной линтер: **golangci-lint** — `golangci-lint run ./...`.
|
||
Набор линтеров задаётся в `.golangci.yml` в корне репозитория.
|
||
Базовый набор: `govet`, `staticcheck`, `errcheck`, `ineffassign`, `gosimple`, `unused`.
|
||
Корпоративный `.golangci.yml` добавим позже.
|
||
|
||
## Тесты
|
||
|
||
- Прогон всех тестов: `go test ./...`.
|
||
- С гонками и покрытием: `go test -race -cover ./...`.
|
||
- Покрытие: мягкий ориентир ~70%+ для бизнес-логики, критичные пути — обязательно;
|
||
интеграционные тесты для внешних зависимостей. (пороги уточним)
|
||
- Именование: `TestXxx`, табличные тесты приветствуются.
|
||
|
||
## Коммиты и MR
|
||
|
||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||
- **Описание MR:** что и зачем изменено, как проверено (линтеры + тесты), ссылка на тикет
|
||
(см. скилл `jira-workflow`).
|
||
- Перед MR прогони линтеры и тесты — всё должно быть зелёным.
|
||
|
||
## Чек-лист перед MR
|
||
|
||
- [ ] `gofmt`/`goimports` без изменений
|
||
- [ ] `go vet ./...` чисто
|
||
- [ ] `golangci-lint run ./...` чисто
|
||
- [ ] `go test ./...` (или `-race`) зелёные
|
||
- [ ] есть тесты на новую логику / фикс
|
||
- [ ] нет секретов и закоммиченных `.env`
|
||
- [ ] описание MR со ссылкой на тикет
|