Недавно я выступал с докладом на nor (DEV): con 2019 о генерации кода с помощью Yeoman js. Эта статья представляет собой расширенное описание этого выступления со ссылками на соответствующие ресурсы. Если вы хотите, чтобы я выступил с докладом на вашей конференции или мероприятии, напишите мне через LinkedIn или Twitter.

Абстрактный

Тезисы доклада были следующие:

«Надоело писать шаблон на работе? Хотите уйти от этого ужасного монорепо, но беспокоитесь о целостности кода? Узнайте, насколько легко использовать кроссплатформенный Yeoman js для автоматического создания кода и шаблонов пакетов, в этой быстрой 5-минутной демонстрации ».

Ресурсы

Эта проблема

В связи с продолжающейся тенденцией перехода от монорепозиториев к пакетным решениям перед нами встает общая инженерная проблема. Если мы не будем осторожны, то мы можем снова и снова писать один и тот же шаблонный код для общих функций репозитория вместо того, чтобы писать уникальный код, необходимый для текущей задачи. Короче говоря, у нас не получается СУХОЙ. У нас также есть возможная проблема с согласованностью, когда мы хотим убедиться, что мы используем одну и ту же файловую структуру, имена классов, правила линтинга, конфигурацию для тестирования и т. Д. Эта проблема еще больше усугубится, если мы перейдем к архитектуре микросервисов, о которой я говорю об этом в моей статье '10 практических уроков, извлеченных из внедрения микросервисов.

Общая функциональность

Вот некоторые примеры общих функций, которые требуются в репозитории:

  • Файлы контроля версий
  • Файлы пакета
  • Линтинг
  • Статический анализ
  • Тестирование
  • CI
  • CD
  • Документация
  • Авто документация
  • Лицензия

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

Решение

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

Что такое йомен

«Yeoman - это универсальная система строительных лесов, позволяющая создавать приложения любого типа. Это позволяет быстро приступить к работе над новыми проектами и упрощает обслуживание существующих проектов ».

«Йомен не зависит от языка. Он может создавать проекты на любом языке (Web, Java, Python, C # и т. Д.) »

Https://yeoman.io/learning/

Хотя Yeoman по сути является пакетом Node.js, его можно использовать для создания файлов кода на любом языке, будь то C #, Python, Scala или обычный текст. В конце концов, это просто инструмент, который создает файлы из шаблонов и запускает дополнительный вспомогательный код. Некоторые языки имеют свои собственные генераторы (например, .NET), но вы можете подумать о том, чтобы избегать их, если вы многоязычная организация и выбираете один инструмент.

Почему Йомен

На рынке есть несколько разных генераторов кода, так зачем использовать Yeoman вместо других. Некоторые из основных причин, которые я считаю важными, заключаются в следующем:

  • Широко принятый
  • Кроссплатформенность
  • Легко использовать
  • Отличная документация
  • Большинство людей знают JavaScript

Установка Yeoman

Yeoman устанавливается с помощью npm. Если это еще не установлено на вашем компьютере, вам нужно будет установить node, с которым npm идет в комплекте. Вы можете узнать, установлен ли у вас npm, выполнив следующую команду:

npm --version

Примечание: для пользователей, более знакомых с Node.js, команда npm doctor - отличный способ предоставить еще больше информации о вашей установке.

После того, как вы установили npm, вы можете установить Yeoman глобально и добавить его в свой PATH, выполнив следующую команду:

npm install yo -g

Теперь вы настроены на использование Yeoman, но у вас нет установленных генераторов. Все генераторы Yeoman также являются пакетами npm и для использования должны быть установлены глобально. Чтобы увидеть, какие генераторы вы установили, вы можете запустить:

yo

Многие организации, производящие инструменты и библиотеки с открытым исходным кодом, используют Yeoman для создания примеров или для начала работы. Вы можете изучить различные генераторы, посетив веб-сайт Yeoman. Отличный и, возможно, неожиданный пример - генератор кода от Microsoft, который используется для создания расширений vs code.

Чтобы запустить генератор, вы можете выбрать, если после выполнения команды ‘yo’, или вызвать напрямую, используя следующую команду:

yo {name}

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

Генератор голых костей

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

Шаг №1: Создайте Package.Json

Yeoman обнаруживает шаблоны по соглашению об именовании пакета, которое хранится в файле ‘package.json’. Итак, прежде всего создайте файл package.json с помощью ‘npm init’ и выберите имя.

generator-{name}

Если вы используете частный реестр для пакетов узлов, вы все равно можете использовать область:

@{scope}/generator-{name}

Вам нужно, чтобы ваш файл ‘package.json’ выглядел примерно так:

При установке убедитесь, что вы установили ‘yeoman-generator’ последнюю версию:

npm install yeoman-generator --save

При использовании ключевого слова ‘yeoman-generator’ и публикации вашего генератора в официальном реестре npm ваш генератор будет автоматически обнаружен на веб-сайте Yeoman.

Шаг № 2: Добавьте файлы

Далее нам понадобятся файлы. Раздел files в нашем файле package.json указывает Yeoman, где искать генераторы. В нашем примере это папка генераторов. Наша файловая структура хочет получить что-то вроде этого (на следующем шаге мы отредактируем index.js).

├───package.json
└───generators/
 ├───app/
 │ └───index.js
   ├───templates
   │ └─── {files to copy}

Yeoman по умолчанию будет искать файл index.js внутри папки ‘app’ при запуске генератора с помощью команды ‘yo’. Минимум, который нам нужен в файле index.js, следующий:

Обратите внимание, что наш класс генератора наследуется от модуля yeoman-generator, который мы установили ранее.

Следует обратить внимание на то, что .gitignore не будет включен в пакет npm при его создании и загрузке. Это может быть проблемой, если вы хотите создать файл .gitignore, что является обычным делом. Простой и легкий способ обойти это - просто дать вашему файлу .gitignore какое-нибудь другое имя (например, .gitignore-template) и при его копировании присвоить ему правильное имя.

Шаг № 3: Пользовательский ввод

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

Тип ввода может быть текстовым, но также может быть список параметров, например то, что я использовал для ввода лицензии. Это также может быть логическое значение с использованием типа «подтвердить». Вы могли заметить, что этот код находится внутри специальной функции под названием ‘prompting ()’. Существует ряд методов жизненного цикла, в которые вы можете поместить свой код, и их имена довольно очевидны. На следующем шаге вы откроете для себя еще один метод жизненного цикла, называемый ‘writing ()’.

Шаг # 4: Запись файлов

Есть два основных способа создания файлов. Первый - это прямая копия из нашей папки шаблонов, которая может быть полезна для чего-то вроде файла .gitignore, который не изменяется.

Второй - взять шаблон и передать в него переменные, такие как вводимые пользователем данные или дату.

Затем в своих шаблонах вы можете использовать нотацию ‘‹% = {variable}% ›’ для вставки в него значений. Вот пример простого шаблона README.md:

Вы также можете создавать файлы только на основе ввода данных пользователем.

Шаг № 5: Тестирование

Перед загрузкой нового генератора в реестр npm или в свой личный реестр вы захотите протестировать его, чтобы убедиться, что он работает правильно. Это легко сделать с помощью команды npm’s link в корне вашего генератора.

npm link

Создайте новую папку, в которой вы хотите создать новое решение с помощью вашего генератора, а затем выполните следующую команду из корня этой папки:

yo

Шаг № 6: публикация

Вот и все! Все, что вам нужно сделать, это опубликовать ваш пакет в реестре npm или в вашем собственном. Теперь ваш генератор готов к использованию кем угодно, установив его глобально с помощью следующей команды:

npm install generator-{name} -g

Теперь, если вы запустите ‘yo’, он должен указать ваш генератор, и все готово. Если вы его не видите, проверьте имя вашего пакета в файле ‘package.json’, чтобы убедиться, что оно соответствует правильному соглашению.

Что дальше?

С нашим генератором мы можем сделать гораздо больше. Учитывая, что это просто Node.js, вы можете создавать все, что только сможете, используя Yeoman. Это включает в себя взаимодействие с другими API, такими как Github, и настройку поддерживающих инструментов DevOps. Вот несколько вещей, которые могут быть полезны:

  • Установить зависимости
  • Инициализировать локальное репозиторий git
  • Создание удаленного репо
  • Настройка конвейера CI / CD

Это превратит ваш инструмент из простого генератора кода в инструмент, который создает все необходимое для компонента. Вы также можете использовать ‘this.spawnCommand’ для запуска другого инструмента командной строки.

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

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

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

О

Мэтью Билл - страстный технический лидер и энтузиаст из Великобритании. Ему нравится нарушать статус-кво, чтобы добиться трансформационных изменений и технического совершенства. Обладая сильным техническим опытом (Node.js / .NET), он решает сложные проблемы с помощью инновационных решений и преуспевает в реализации сильной культуры DevOps.

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

Узнайте больше о Мэтью и его проектах на сайте matthewbill.gihthub.io.

Спасибо за прочтение!

Другие посты Node.js, которые вы могли бы