Node и Go — хорошие языки для написания приложения CLI, но Node — явный победитель в том, что я хочу.

Я люблю CLI-приложения. Я написал множество сценариев на Node и Go, которые я использую через терминал, но я не создал полностью приложение CLI.

Так что теперь я буду.

Я занимаюсь созданием генератора платформы приложений для своих консультационных услуг. Я назвал его «LunarBaby», потому что это забавное имя и сотрудничество с Lunar Collective, где я помогаю вносить открытый исходный код.

Моему генератору требуется приложение CLI, чтобы работать так, как я себе представляю. Пользователи должны иметь возможность запускать lunarbaby create platform awesome-sauce, и он создает всю платформу на своей машине с конвейерами и настройкой инфраструктуры. Он будет интерактивно предлагать пользователю требования и варианты. Затем он извлечет шаблоны репо из Github и настроит локальную среду.

Цель приложения CLI — зачем мы это делаем?

Создайте инструмент, который упрощает определение будущих требований к платформе, чтобы я мог сосредоточиться на разработке бизнес-целей.

Требования интерфейса командной строки

  • Должен быть установлен и запущен в любом месте на компьютере пользователя.
  • Должна быть возможность предложить пользователю дополнительные вопросы и рекомендации.
  • Должен уметь легко различать аргументы и флаги.
  • Написание справки, примеров и описаний должно быть простым.
  • Должен быть в Go или запускаться через Node (личные предпочтения).
  • Должна быть возможность легко расширяться для нескольких команд и будущих потребностей.
  • Не должен быть слишком громоздким с функциями, которые не нужны.
  • Должно быть легко настроить и начать работу.
  • Должен быть с открытым исходным кодом.

Обзор CLI Frameworks & Options

Вариант 1. Запрограммируйте приложение CLI с нуля.

Начну с очевидного варианта. Мне не нужно использовать внешнюю структуру для создания моего приложения CLI. Вам не нужно обладать какими-то особыми секретными знаниями, чтобы запрограммировать скрипт через командную строку с помощью Node или Go. Вы можете сделать и то, и другое очень легко от этих поставщиков.

Я делал это много раз.

В Go легко создать простой CLI-скрипт. Добавьте свой основной файл go, импортируйте пакеты os и flag и viola. У вас есть все, что нужно для создания CLI-скрипта в Go.

Соберите сценарий в двоичный файл или запустите его через go run, чтобы делать то, что вы хотите.

То же самое верно и в приложении узла. Большая разница в том, что гораздо проще скомпилировать приложение go в двоичный файл. Но здесь это не проблема, потому что у большинства пользователей установлен Node, использующий мои скрипты.

Проблема с пользовательским приложением CLI?

Был задействован шаблон и переписывание колеса.

При создании этого инструмента командной строки, который мне нужен, существует множество основных функциональных требований. Это еще до того, как я углублюсь в бизнес-логику того, что будет делать это приложение. Я бы предпочел не переписывать колесо, если бы у меня были другие решения, которые сделали это до меня.

Я создаю это приложение CLI так же, как если бы я создавал облачное, мобильное или браузерное приложение. Использование тех же концепций и основ, которые создают успешные веб-приложения. Одно из основополагающих убеждений — не переписывать колесо.

Если для вас есть фреймворк, пакет или инструмент, который уже делает это хорошо, используйте его. Не думайте о своем коде как о картине Рембрандта, которую вы должны построить сами.

Опирайтесь на величие других.

Вариант 2. Приложение Go CLI с пакетом Cobra

На рынке довольно много пакетов Go CLI. Пакет Cobra, безусловно, самый популярный для языка. Kubernetes, Github и Hugo CLI построены на основе этого пакета. Он мощный, легкий и производительный. У него более 18 000 звезд на Github.

Никуда не денется и это очень хорошо.

На самом деле у меня есть опыт разработки с пакетом Cobra CLI. Я использовал его в прошлом при создании небольших сценариев для компании, в которой я работал в прошлом.

Мне понравилось… до определенного момента.

Начну с плюсов.

Преимущества

  • Я использовал его в прошлом / нет кривой обучения. Это большое дело. Я могу настроить новый репозиторий go, создать свои модули go и импортировать пакет Cobra. Я смогу начать работать с моим CLI-приложением и начать работать без дополнительного обучения. Это должно быть большой отметкой для любого хорошего разработчика, работающего над проектом. Если то, что вы знаете, может выполнить задачу (и сам проект не направлен на изучение новых технологий), тогда идите туда, где вам удобно, когда сможете.
  • Он создан и разработан. Этот пакет никуда не денется. Существуют основные приложения cli, использующие пакет Cobra. Если приложение Kubernetes CLI чувствует себя комфортно с производительностью и зрелостью этого пакета, то это хороший положительный момент. Всегда ищите зрелые пакеты.
  • Он хорошо организован. Средства командной строки могут быть похожи на веб-фреймворки. Действительно хорошо, когда вы начинаете, но очень дезорганизованы, так как вам нужно расти. При использовании этого фреймворка легко добавлять новые команды. Создайте новый файл go в каталоге команд, добавьте некоторые детали конфигурации, и все готово. Помощь, описания, аргументы, флаги и все необходимое прямо перед вами.

Недостатки

Я действительно хотел выбрать Cobra, и пусть это будет день. Но я знал, что это не будет хорошим решением, если я просто пойду с ним и попытаюсь заставить технологию соответствовать моим потребностям, даже если я знаю, что это неправильно.

Я знал, что это не будет хорошим решением, если я просто пойду с ним и попытаюсь заставить технологию соответствовать моим потребностям, даже если я знаю, что это неправильно.

Cobra — хороший пакет, но у него есть некоторые недостатки, основанные на моих требованиях.

  • Он не идеален для сложных приложений CLI. Мне очень нравится пакет Cobra, но он усложняется, если вы хотите сделать свое приложение более сложным. Например, нет простого решения, если вы хотите создать дочерние команды. Требуется хорошее воображение и набор навыков, чтобы расширить приложение, не усложняя его архитектуру. Я ищу что-то более простое.
  • Он не поддерживает интерактивный режим. Это немного мешает строительному приложению, которое я создаю. Я рассматриваю этот инструмент как диалог между пользователем и приложением, чтобы определить, какие функции и функции потребуются пользователю. Нужен ли пользователю конвейер Gitlab или CircleCI? Потребуются ли для этой платформы транзакции Stripe CC? Cobra — хороший пакет для создания приложений CLI, но для выполнения того, чего я хочу, потребуются дополнительные пакеты.

Вариант 3: Приложение Node CLI с пакетом OCLIF NPM

Проведя небольшое исследование альтернатив пакету Cobra CLI для Go, я наткнулся на интересную среду CLI от Heroku. Пакет OCLIF обещает возможность создания любого общего приложения CLI, а также является основой для CLI Heroku.

Хороший.

Мне всегда нравился CLI Heroku. Он интерактивный, быстрый и делает то, что мне нужно. Фреймворк имеет более 5000 звезд и активно поддерживается. Я уверен, что этот пакет справится с моим приложением. Это хороший выбор.

Преимущества

  • Он построен в интерактивном режиме. Большое преимущество этого пакета по сравнению с пакетом Cobra. Это требование для меня. Мне не нужны дополнительные пакеты, чтобы выполнить то, что я хочу.
  • Он готов к Typescript. Это не мешает, но для меня это важно. Я не возражаю против создания небольших скриптов и сервисов на чистом Javascript, но я не хочу делать это для какого-либо значимого приложения. Мне очень нравится, что фреймворк поставляется с готовым для меня Typescript.
  • Хорошая организация и масштабируемость. Не принимайте мои слова в этом вопросе как закон, но при первом рассмотрении оказывается, что это очень хорошо организованная структура для создания масштабируемого приложения CLI, которое соответствует моим потребностям. Я создаю класс Typescript в каталоге команд, который расширяет класс Command фреймворка. Перезаписать некоторые переменные и функции. Добавьте логику, и я готов к работе. Я могу добавить столько команд, сколько захочу, и это не должно влиять на производительность, основываясь на описании пакета. Флаги, аргументы, описания, примеры и текст справки легко настраиваются.

Недостатки

  • Кривая обучения. Я никогда не использовал этот пакет для создания инструмента CLI. У меня будет более длинная кривая обучения, чтобы начать работу над моим приложением, чем у Cobra. Это, очевидно, не проблема для пакета, но это важный фактор, когда мне нужно оценить свои потребности. Хорошая архитектура не всегда объективна. Существует субъективное искусство знать, что лучше для вашей команды инженеров, исходя из их собственного опыта.
  • Неизвестное. Эта проблема основывается на первом вопросе. Сейчас пакет может показаться идеальным, но разве это тот случай, когда «трава зеленее». Легко влюбиться в новую игрушку еще до того, как вы по-настоящему с ней поиграете и не ощутите ее ограничения. Нет идеальных пакетов, инструментов или фреймворков. Я не ожидаю, что этот пакет будет Эдемом. Я уверен, что раскрою разочаровывающие функции и функции.

Заключение: использование Node и пакета OCLIF

Я использую пакет Node + OCLIF, потому что он соответствует моим собственным требованиям. Создание моего собственного приложения CLI с нуля было просто глупым замечанием без основы. Мне нравится пакет Cobra, и я предпочитаю Go во многих отношениях, но он просто не подходит для работы.

Я выбираю Node + OCLIF, потому что он соответствует требованиям моего собственного проекта, а не потому, что он объективно лучше для всех вариантов использования.

Важно отметить, что я не оценивал языки и фреймворки по их общим достоинствам. Я не утверждаю, что одно лучше другого на всю вечность. Я не говорю, что один победитель, а другому нужно идти в свою спальню и плакать в подушку.

Я просто говорю, что пакет OCLIF подходит для моего варианта использования.

Хорошие инженеры-программисты знают, что все языки и фреймворки — это инструменты в коробке. Не существует универсального инструмента для всех. Вы не вытаскиваете молоток, когда вам нужна пила. Используйте правильный инструмент для правильной работы и продолжайте расширять свой ящик, чтобы сделать больше.

Частное сообщество для новых веб-разработчиков, разработчиков программного обеспечения и приложений

Хотели бы вы присоединиться к частному сообществу и новостной рассылке, посвященной развитию потрясающей карьеры профессионального веб-разработчика? Узнайте больше о частном сообществе Patreon ниже.