В течение долгого времени я перепробовал множество различных способов управления средой разработки. От файлов Make до PM2 и Tmux.
Tmux — это ну… tmux. Tmuxinator делает его управляемым, но определение «макета» далеко не всегда читаемо, а копирование ошибок из истории в буфер обмена — настоящая боль в заднице.
Я все же рекомендую взглянуть на PM2, если вам нужно нечто большее, чем «запустить все». Он поставляется с большим количеством опций, но это также означает, что ваш конфигурационный скрипт будет отличаться некоторой многословностью.
В этой статье объясняется, как я покрываю свои простые сценарии использования. Те, которые не требуют дополнительных наблюдателей за файлами (см. PM2), или раздельных панелей для разделения журналов при сохранении одного терминала (см. Tmux). Для них я использую Procfile.
Не бойтесь, Procfile здесь!
Procfile? Да, когда я впервые услышал это слово, я подумал: «Не очередной make-файл, да?!». Но, к счастью, ничего подобного. Давайте приступим.
Итак, Procfile — это простой формат key: command
. И, как и Dockerfile, он по традиции называется в честь формата. Я рекомендую создать файл с именем Procfile
в корне вашего проекта и зафиксировать его в репозитории. Если не для себя, то для каждого нового участника, который однажды присоединится к вашей команде.
Для MagicBell наш procfile выглядит следующим образом:
server: bin/rails s -p 3000 -e development
worker: bin/bundle exec sidekiq
webpack: bin/webpacker-dev-server
Вот и все. Вот и вся конфигурация, необходимая для запуска нескольких сервисов с помощью одной команды.
Очевидно, что нам все еще нужно установить бегунок для обработки этого procfile. Познакомьтесь с foreman или одним из его форков. Foreman — это Ruby-скрипт, поэтому для его работы вам понадобится установленный Ruby. Однако существует множество форков. Например, shoreman, который представляет собой свободный от зависимостей shell-скрипт, или node-foreman, который является форком javascript. Я выбираю node-foreman по той простой причине, что я работаю с node, и мне нравится, что я могу npm install
установить его в зависимости моих node-проектов.
Итак, идите вперед и установите node-foreman
. В этом руководстве мы будем действовать глобально. Отбросьте -g
, если у вас есть конкретный проект.
npm i -g node-foreman
Node-foreman устанавливает двоичный файл с именем nf
. Установив его, можно просто запустить nf start
в том же каталоге, что и ваш Procfile
. Попробуйте, и увидите, как все ваши службы запускаются и регистрируются в одном терминале. Если у вас есть файл .env
в том же каталоге, node-foreman
автоматически загружает из него все переменные окружения. Если ваш файл env назван по-другому, например .env.development
, вы можете указать его с помощью флага --env
. Используйте флаг --procfile
, если вам нужно указать Procfile.
Немного больше… вкладки
Вышеперечисленное может быть всем, что вам нужно. Но иногда мне нравится, когда процесс запуска немного персонализирован. Для этого я использую скрипты, которые храню в своем домашнем каталоге.
Для MagicBell мой конфиг состоит из двух файлов. Один пользовательский procfile, сохраненный как ~/scripts/magicbell.proc
:
server: bin/rails s -p 3000 -e development
worker: bin/bundle exec sidekiq
webpack: bin/webpacker-dev-server
codegen: yarn codegen -w
И «исполняемый» скрипт, который я запускаю, сохраненный как ~/scripts/start-magicbell
(не забудьте chmod +x
)
#!/usr/bin/env bash
cd ~/dev/magicbell/backend
ttab docker-compose up
bundle install
yarn install
yarn db:migrate
nf start -j ~/scripts/magicbell.proc -e .env.development
Когда вы читаете этот скрипт, вы заметите ttab
. ttab — это небольшая утилита, которая позволяет нам запускать команды в новой вкладке терминала. Таким образом, я могу запустить postgres & redis в одном экземпляре терминала (вкладке), а все остальное — в другом. Ttab необязателен, но я настоятельно рекомендую использовать его для простоты.
npm i -g ttab
Поскольку я добавил ~/scripts
в свой PATH
, я могу запустить среду MagicBell с помощью одной команды start-magicbell
. Сейчас я расскажу вам, что она делает:
- сначала она переходит к git-репозиторию на моем диске по адресу
~/dev/magicbell/backend
- запускает
docker-compose up
в новой вкладке, отделенной от текущей - устанавливает все рубиновые гемы, пока db раскручивается
- устанавливает все модули node
- запускает наш скрипт миграции базы данных
- запускает четыре службы, определенные в procfile
С помощью этой единственной команды я запустил 6 сервисов и выполнил несколько команд установки/миграции. Слишком часто случалось, что мне приходилось вручную устанавливать новые гемы или модули после внесения изменений. Эти команды достаточно быстры, чтобы выполняться как часть моего запуска, но при этом требуют достаточно времени, чтобы база данных была в сети до запуска сервера.
Вот и все. И node-foreman, и ttab поставляются с кучей опций. Поэтому обязательно ознакомьтесь с их описаниями (особенно с node-foreman!)
👋 Я Стефан. Следите за мной в Twitter, если подобные вещи вам интересны.