⌨️ Разработка CLI инструментов без боли. Введение.

Lebedev Konstantin
3 min readApr 10, 2021

--

Честно, не знаю проектов, которым не нужны были бы какие-либо 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 🧙🏻‍♂️

Логирование/Форматирование/Разделители — всё это @mail-core/cli

--

--