⌨️ Разработка CLI инструментов без боли. Введение.
Честно, не знаю проектов, которым не нужны были бы какие-либо shell-скрипты/утилиты, но это никак не мешает их отсутствию в реальности.
Именно по этой причине разработка «Платформы» началась именно с @mail-core/cli
, пакета, который не только должен упростить написание любых shell-скриптов, а дать целую инфраструктуру и инструментарий для создания богатого Command Line Interface (или просто CLI ⌨️).
Ведь основная идея «Платформы», это минимум ручных действий/документация/пояснений, разработчику нужно просто выполнить команду и получить результат.
SHELL / TERMINAL / CONSOLE
CLI-инструменты отличаются от обычного кода тем, что среда их выполнения непривычный нам браузер, а shell, поэтому писать их можно на чём угодно, не зависимо от основного языка.
Например, какое-то время, когда я изображал Go-разработчика, написал для себя ~/.bashkit/, чтобы писать максимально неприхотливые cli-скрипты (зависящие только от bash).
Но, так как мы говорим о фронтенде, то конечно мы хотим писать cli-инструменты на JavaScript, а ещё лучше на TypeScript.
И вот тут начинают всплывать проблемы из-за которых cli-скрипты очень часто просто остаются на уровне «эх если бы сбылась моя мечта», либо на выходе получается JS не первой свежести.
Причина в том, что код нужно запускать в терминале:node scripts/init.js
а значит, успех запуска будет зависеть от версии NodeJS.
Конечно это можно обойти через npx @babel/cli …
, либо через ts-node …
, если вы используете TS, но это решение только локального запуска (внутри пакета).
А … ?
- Как сделать, чтоб это ещё работало
npx my-package init
т.е. полноценная команда пакета? - Что если этих команд больше чем одна?
- Хелп? Парсинг параметров? Работа с консолью? …?
И чем больше в эту тему погружаешь, тем больше нюансов всплывает, что приводит к архаичному написано/копипасту скриптов (в лучшем случае), либо банально их отсутствию (find and replace и так сойдет).
@mail-core/cli
Как я уже сказал, с этого пакета началась «Платформа» и как показало время, это было верным решением, т.к. пакет стал ядром всех остальных, предоставив единый интерфейс для взаимодействия с ними.
Пакет предоставляет:
- Единый интерфейс описания cli-команд (название, описание, опции и жизненный цикл)
- TypeScript
- Локальный запуск (не думая про сборку) и саму сборку при публикации пакета
- Утилиты для работы c shell/npx/npm/package.json
- Логгер/Console и методы для стилизации output
- Методы для интерактивного взаимодействия с юзером
Конечно это не всё, что есть, но думаю направление понятно.
Может показаться, ничего сложного и для каждого пункта, по отдельности, есть готовое решение, но поверьте, это не так!
Дальше я постараюсь показать, в чём же суть хорошего CLI, как он должен выглядеть и какой UX/DX опыт предоставлять.
И покажу я это во второй части :]
Сорян, решил буду по частям писать, а то никогда не допишу за раз, пока покажу самый лучший результат использования на примере Wisever 🧙🏻♂️
📣 Канал: https://t.me/artifact_project
🗃 GitHub: https://github.com/mail-core