CLI · Winter Console

Команда cfg

cfg разворачивает и поддерживает конфигурацию проекта: файл .env, секрет WINTER_KEY, Docker-обвязку и автодополнение оболочки. Это первое, что запускается при создании проекта, и то, к чему возвращаются при настройке окружения.

Субкоманды init · key · env · docker · completionПервый запуск cfg init

Что такое cfg и зачем

cfg — команда управления конфигурацией проекта.

Проблема. Новый проект нужно привести в рабочее состояние: создать .env, сгенерировать секретный ключ, при желании — Docker-файлы и автодополнение. Делать это руками — легко забыть шаг.

Решение. cfg собирает эти операции в субкоманды, а cfg init выполняет базовую настройку одной командой. Об этом и раздел.

Субкоманды

Субкоманда Назначение
init Патчит composer.json, создаёт .env, генерирует ключ, кладёт stub-мету
key Управление WINTER_KEY
env Управление файлом .env
docker Генерация Docker-файлов
completion Установка/печать автодополнения оболочки

cfg init

Приводит проект в рабочее состояние (вызывается автоматически при composer create-project):

bash
php call cfg init

Последовательность: патч composer.json (перезапись name и description, очистка authors/keywords) → создание .env → генерация WINTER_KEY.

cfg key — секретный ключ

Флаг Действие
key -g Сгенерировать/перегенерировать ключ (64 hex = 32 байта) и записать в .env
key -s Показать текущий ключ
bash
php call cfg key -g   # новый WINTER_KEY

Нужен .env

key -g предупредит и прервётся, если .env отсутствует — сначала создайте его (cfg env -i).

cfg env — файл окружения

Флаг Действие
env -i Создать .env из шаблона (пропускает, если существует)
env -s Напечатать загруженный $_ENV
env -s --file Напечатать сырое содержимое .env

cfg docker — Docker-обвязка

bash
php call cfg docker

Создаёт Dockerfile, docker-compose.yml, .dockerignore и каталог docker/ со скриптом запуска и настройками PHP. Опций у команды нет — образ один, под Swoole, а режим выбирается переменной при запуске:

Запуск Режим
docker compose up Рабочий: opcache включён, наблюдателя нет
DEV=true docker compose up Разработка: перезапуск по изменению файлов, opcache выключен

Расширения PHP и драйверы БД

Ставятся не правкой Dockerfile, а отдельными скриптами в docker/dependencies/. Сборка выполняет их в порядке числового префикса; в комплекте идут четыре:

Скрипт Что ставит
10-bcmath.sh bcmath — точная арифметика (деньги, Number)
20-pgsql.sh pdo_pgsql + pgsql — PostgreSQL
30-mysql.sh pdo_mysql — MySQL / MariaDB
40-redis.sh phpredis — клиент Redis

Ненужные просто удалите: чего нет в каталоге, того не будет и в образе.

Каждый скрипт самодостаточен — сам ставит всё, что нужно для сборки, и сам это снимает. Поэтому его можно скопировать в другой проект или запустить руками, а свой написать по тому же образцу:

docker/dependencies/50-intl.sh
#!/bin/sh
set -e

# intl — форматирование дат и чисел, сортировка по локали.
if php -m | grep -qi '^intl$'; then
  echo "intl already present — skip"
else
  apk add --no-cache icu-libs \
      && apk add --no-cache --virtual .intl-deps $PHPIZE_DEPS icu-dev \
      && docker-php-ext-install -j"$(nproc)" intl \
      && apk del .intl-deps
fi

Существенны здесь три вещи:

  • Проверка php -m — расширение может уже оказаться в базовом образе; тогда скрипт ничего не делает и не тратит время сборки.
  • --virtual — компилятор и заголовки ставятся под общим именем .intl-deps и снимаются одной командой, поэтому в готовый образ не попадают. Остаётся только рантайм-библиотека (icu-libs), без которой расширение не загрузится.
  • $PHPIZE_DEPS — набор для сборки расширений, заданный базовым образом PHP (компилятор, make, autoconf, re2c). Перечислять пакеты руками не нужно.

Упавший скрипт останавливает сборку

Ошибка в любом из скриптов роняет сборку образа — намеренно. Иначе получился бы зелёный образ с недостающим расширением, и узнали бы вы об этом при первом обращении к базе, уже в рантайме.

cfg completion — автодополнение

Флаг Действие
(без флага) Напечатать скрипт в stdout
-i Установить
-if Установить с перезаписью
bash
php call cfg completion -i

Оболочка определяется по $SHELL: zsh → ~/.zsh/completions/_call (добавляет fpath в ~/.zshrc), иначе bash → ~/.bash_completion.d/call.

Дальше