Yeoman для новичков

  • Tutorial


Есть такие программы и утилиты, воспользовавшись которыми, пользователь возопит: «Не знаю, как я мог жить без этого инструмента раньше!». На мой взгляд, консольная утилита Yeoman, написанная на Node.JS, относится как раз к разряду таких незаменимых инструментов. Почему?

Итак, для начала давайте определимся, какой программный код генерирует Yeoman.

Есть в программирование такое понятие — скаффолдинг (от англ. scaffold – «строительные леса»). Оно означает автоматическое построение структуры проекта. Могу ошибаться, но как подсказывает память впервые оно было использовано в Ruby on Rails. В Рельсах была специальная команда, которая генерировала код контроллеров и моделей.

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

Таким образом, первый шаг работы по созданию чего-то нового в любой системе — воспроизведения базового шаблона той или иной конструкции, которая заложена в её фундамент. Например, если вы в рамках выбранного фреймворка, например Laravel на PHP, строите свой сайт, вы по-любому будуте создавать контроллеры, модели, миграции, сиды и так далее.

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

Поэтому летом 2012 года свет увидел приложение, о котором идёт речь в данном материале.

Встречайте:



Сайт программы достаточно познавательный:
http://yeoman.io
На нём вы можете найти массу полезной информации.
Вот, например, типичная схема настройки рабочего пространства современного разработчика:



  • Генерируем скелет приложения при помощи Yeoman
  • Устанавливаем дополнительные скрипты при помощи Bower
  • Запускаем веб-сервер и сопутствующие полезные утилиты при помощи Grunt (или Gulp, о которым было написано пару дней назад)

Давайте же освоим основы работы с Yeoman, чтобы каждый, кто ещё не видел эту программу в действии, понял бы её необходимость в ежедневном рабочем процессе.

Установка


Сокращённо наш верный помощник называется yo.
Поэтому его установка выглядит следующим образом:

 sudo npm i -g yo # сокращённо npm install yo -g

 Исполнять этот код нужно, как вы уже поняли, в окошке терминала:



Всё, на этом установка завершена.
Давайте запустим теперь эту программу и посмотрим, что она умеет делать.

Начало работы


Поскольку мы использовали параметр -g при установке из менеджера пакетов npm, наш верный помощник YeoMan установился глобально. То есть его можно вызвать из любого места, какой бы ни была текущая директория вашего Терминала.
В ином случае пришлось бы запускать программу только из той директории, в которой была запущена программа установки.

Запустим программу простым вызовом команды yo в Терминале и посмотрим, что же она умеет делать:



Как видите, YeoMan встречает автора статьи, приветствуя по имени. Далее программы предлагает запустить один из ранее установленных генераторов.
О том, как они устанавливаются, чуточку позже.
Давайте пока выберем один из них и посмотрим, как он работает.
Запускаем генератор WordPress:



Этот генератор устанавливает последнюю версию WordPress.
Перед установкой он просит нас ответить на ряд вопросов — адрес сайта, настройки базы данных и так далее:



Установка последней версии из Git:



Запись файлов:



Завершение работы:


Таким образом Yeoman меньше чем за минуту проделал ту работу, на которую раньше мы тратили как минимум несколько минут и много кликов мышки.

Установка генераторов


Как можно было понять из написанного выше, Yeoman – это только оболочка, интерфейс, который осуществляет работу многообразия генераторов.
Как искать и ставить сами генераторы?
Можно через официальный сайт:



http://yeoman.io/generators/
А можно и через консоль:




Заключение


Задачей данной публикации была демонстрация работы Yeoman и пробуждение у читателя интереса к автоматизации процесса разработки. Ведь в конечном счёте, чем больше вы задумываетесь над оптимизацией и используете полезные инструменты — тем больше свободного времени для личных нужд у вас остаётся.
Пускай ту часть работы, время которой мы можем потратить на семью, делают машины. И Yeoman в этом плане прекрасный помощник.
Изучайте, пробуйте, радуйтесь вместе с нами.
Официальный сайт программы:
http://yeoman.io

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

Комментарии 51

    +3
    Вот знаете в чем проблема Yeoman? В том что встречаются мертвые генераторы или генератор который вроде все развернул и даже работает но на гите висит 40 багов и тесты вообще не работают. Желания разбираться в чем причина при учете что автор просто «забил» вообще нет. (Причем генератор популярный).
      +12
      Это проблема всего Open Source в целом.

      Что вы хотите, бесплатный сыр и без мышеловки? Люди занимаются Open Source тогда, когда есть возможность.

      По сему, не судите строго. А ещё лучше — вносите свой посильный вклад.
        0
        Да есть такое дело. Но обидно что вроде вещь отличная есть люди кто готов поправить проблемы и я в их числе. Ну да ладно.
          0
          Разве не в репозиториях хранятся исходники генераторов? Тогда можно было бы написать автору и попросить его включить вас в качестве контрибьютора. Или Pull-request с изменениями отправить.
            +1
            Делаете форк, фиксите баги, юзаете свою же версию. Или, как уже посоветовали, отправляете PR.
              +1
              Да сделал я так, чего вы накинулись :)

              Просто обидно что «мертвые» репозитории в топе и нету модерации жесткой.
                0
                Вы бы с этого начинали :-)

                Просто тут могли подумать, что вам не нравится Open Source.
                  0
                  Да я думал уже вымерли те кому не нравится Open Source как таковой.
                    0
                    Имеете в виду Microsoft? :-)
                      0
                      А с каких пор MS'у не нравится Open Source? Неужто с того самого момента как они начали выкладывать многие свои наработки в открытый доступ?
                        0
                        Возможно. Но сколько лет они этого не делали? Исходный код главного детища всё равно под семью замками.
                          0
                          А с каких пор MS'у не нравится Open Source?


                          С момента рождения MS, очевидно. Первые попытки «поиграть» в Open Source еще не говорят о том, что завтра они продолжат показывать эту «любовь». Давайте подождем хотя бы лет 5, посмотрим.
              0
              Видимо проблема не в оперсорсе, а в модерации и ранжировании генераторов. Авторов надо поощрять поддерживать свое детище в актуальном состоянии. Иначе будет свалка где на один работающий будет десять неработающих
                0
                Тоже верно. Наверное, им надо было более избирательно подходить к этому вопросу.
            0
            Отличный инструмент.
            Недавно начал делать скаффолдер для REST API на основе Sails. Теперь разворачиваю настроенное API с оптимизациями и с готовой авторизацией через JWT + bcrypt за полминуты.

            Вот думаю, продолжить это дело и дополнить скаффолдер еще фабриками для отправок писем, смс, работы с амазоном и т.д. Чтобы при разворачивании проекта оставалось только API ключи прописать.
              0
              Это интересно. Вы выложили его в главный репозиторий Yeoman?
                +1
                Да, он там уже есть и пока только под версией 0.1.0, которая делает просто разворачивание проекта. В 0.2.0 включится автоматическая установка зависимостей, готовая фабрика для cipher'ов и интегрирован passport с возможностью делать локальную авторизацию по username\password паре и Facebook с Twitter токенами.

                Исходники — клац
                Название в репозитории yeoman — sails-rest-api.

                ЗЫ. Отличительной чертой данного скаффолдера является уже настроенный Sails для работы с REST API. То есть, там уже выключены все ненужные хуки и функционал вроде Grunt, views и подобные. Получаете только чистый backend в виде API.
                  0
                  Великолепно, как раз изучаю Sails.JS.
                0
                Не холивара ради, просто любопытно.

                Почему выбрали Sails? С чем (из nodejs) сравнивали? Чем привлекло?
                  0
                  По количеству коммитов и активных контрибьюторов Sails пока на первом месте.

                  Также очень радует его ODM Waterline, которая работает просто прекрасно и уровень абстракции очень хороший.
                    0
                    На втором. Express по очевидным причинам на первом.
                    Вы имели ввиду ORM? Пробовали Sequelize?
                      0
                      Sails построен на Express. Радуют его blueprints, которые с коробки генерируют все REST роуты, есть policies, где можно писать ACL. На Express это пришлось бы делать все самому.

                      Нет, я имел ввиду именно ODM (Object Document Mapper), в то время как ORM — это Object Relation Mapper. А так как Mongo — это документо-ориентированная, то логичнее считать Waterline ODM. Правда это спорный вопрос, так как Waterline поддерживает и ORM :)
                        0
                        Забыл отправить комментарий пару дней назад.

                        Спасибо. Действительно, перечисленное это фундаментальные аспекты которые могу повлиять на выбор.

                        Коллега год назад с Sails.js работал. Хотел перейти с Express. Докладывал что встречал кучу трудностей.
                        Интересно просто как сейчас.

                        На сайте пишут что все отлично, только так всегда. Пока с людьми которые использовали не поговоришь, ничего не узнаешь.

                        Мне к примеру очень нравится hapi.js но его фундаментальный и жирный минус в том, что нужно очень много писать самостоятельно и рыться чуть ли не в исходниках, потому что много чего меняется (в лучшую сторону) но все равно нужно за этим следить.

                        ORM / ODM… думал это опечатка просто.
                        Думаю нас еще ждет в ближ. пару лет терминологическая неразбериха с ORM / ODM / OGM / O WTF M

                        CAP ограничения порождают разные классы БД с разными tradeoff так что будет много желающих
                        посидеть на всех стульях / придумать свой велосипед OFTWM :)
                          0
                          Согласен. В hapi с этим хуже.
                          Я работаю с Sails уже чуть больше года и все устраивает. Не без минусов, конечно, но это все решается парой шаблонов проектирования. К тому же Waterline действительно «решает» в связке с Sails.
                            0
                            Спасибо за мнение :) Успехов и приятного кодинга :)
                        0
                        Посмотрел на Sequelize. Это же чисто ORM. Нету поддержки документо-ориентированных БД.
                  +1
                  Будет здорово, если появится подобный краткий обзор по Grunt/Gulp, т.к. эта заметка получилась очень лёгкой и информативной, спасибо.
                    +1
                    По Gulp я делал публикацию пару дней назад, но не здесь.

                    Посмотрите
                    +1
                    Обожаю angular-fullstack. Единственное: grunt крутой, но медленный.
                      +1
                      Хм, с gulp + webpack больше заморочек, но он гораздо быстрее.
                        0
                        О каких именно заморочках идёт речь?
                          0
                          Синхронизацию потоков — построение цепочек с зависимостями, возвращение и объединение, мало кто понимает.
                          А так у меня были наброски более-менее нормального Seed'а под Gulp.
                      0
                      Спасибо за статью. Давно слышал что такое есть, но не было времени пощупать. Кстати, это ок установленный локально yeoman генераторы устанавливает глобально?
                        0
                        Хороший вопрос. Сейчас попробую поставить локально. Тогда смогу дать более определённый ответ на ваш вопрос.
                          0
                          Насколько я понял, он всегда ставится глобально.

                          +4
                          Ценность всего этого дела видимо только в генераторах шаблонов. Если же сам шаблон проекта мне не подходит — выходит нужно писать свой генератор. Да только зачем мне писать генератор если шаблон у меня уже есть? Разве что для того чтоб с другими им поделится. Мне кажется достаточно было бы создать каталог шаблонов проектов с описаниями в одном формате. Это реализовать проще, и авторам легче добавлять в каталог свои шаблоны (не нужно разбираться с тем как генератор написать), и нагляднее для разработчиков (сразу видно не генератор, а итоговый результат).
                            +6
                            Плюс возможности совместить целый из нескольких простых изолированных шаблонов.
                              +2
                              В генераторе вы можете свой «шаблон» кастомизировать каким-нибудь образом через опции (имя приложения задать, имя модулей, зависимости разные подключать по необходимости, сторонние сервисы и т.д.). Имея просто шаблон кода — его нужно будет под новый проект менять вручную (в зависимости от нужд). У нас в компании написан свой генератор проектов на yo, и у нас там примерно 15 разных вопросов во время генерации (каждый из которых, в конечном итоге, что-то меняет в сгенерённом коде). Но у нас часто стартуют проекты (и их довольно много), можно сказать, специфичный случай, поэтому в этом есть смысл.
                              +7
                              Странная тулза.
                              А я просто дербаню куски из папки с соседним проектом — выходит довольно быстро. Ну и `npm init` там.
                              А тут — сначала изучи как пользоваться яманом, потом изучи какие генераторы есть, потом изучи что генератор может нагенерировать, потом проверь рабочее ли все это, потом изучи структуру нагенерированного — подходит ли под привычный флоу.

                              Так если надо автоматизировать по 5 проектов в день — может и ок. Но вообще это же одноразовая операция.
                                0
                                Кажется, идея yeoman в том, чтобы оформить шаблон под собственный флоу и выпускать на нем проекты как на конвеере.
                                Если новые проекты нужно начинать не так часто, как выходят новые инструменты (вроде grunt или gulp), то можно обойтись и без yeoman
                                  +2
                                  А вы пробовали оформить шаблон в ямене?
                                  Это не просто сказать «вот так я делаю проект — бери это за шаблон». Это разработать целый отдельный проект.
                                  +1
                                  Ну вот вы всё правильно пишете, это для тех, кто лабает по 10 сайтов в день по 500 рублей.
                                  Если у вас один проект раз в полгода — проходите мимо.
                                  +1
                                  Чем вы занимаетесь по работе, что использование yeoman экономит вам время? На чем вы пишите и какой класс задач решаете? Просто от Bower я сам в восторге, и его приходится дергать часто, даже на долгостоях, не говоря уже о создании новых проектов. Но вот с Yeoman как-то не срастается, хотя видно, что инструмент мощный и популярный.
                                    0
                                    Мне пригождается, когда нужно делать что-то на новом стеке. Я вот все равно не знаю, как лучше сконфигурировать проект под незнакомый мне фреймворк, а изучать приходится. Так легче взять что-то готовое и разобраться что мне там подходит, а что нет, чем с нуля копаться и набивать шишки. Ну и по ходу копирую генератор (чтобы не затерлось при обновлении) и вношу свои изменения на будущее для этого стека.
                                    0
                                    Местами оно вроде ок, но мне недавно «понадобилось» webapi на c# — сгенерил хрень.
                                      0
                                      ну так ваша задача узконаправленная, удивительно, что вы вообще хоть что-то под нее нашли)
                                      +2
                                      По-моему самое интересное в yeoman даже не генерация шаблона всего приложения целиком. Как тут уже сказали, это разовая операция и писать под нее такую мощную утилиту было бы странно. Главное, что yeoman может генерировать отдельные части уже созданного приложения, те же контроллеры, например. Вот наглядный пример из офф документации:

                                      $ yo angular:controller myController
                                      $ yo angular:directive myDirective
                                      $ yo angular:filter myFilter
                                      $ yo angular:service myService
                                      


                                      Это действительно может помочь в ежедневной рутине, если модули приложения имеют сложную, но схожую структуру.
                                        0
                                        Согласен с вами. Иногда не нужно генерить целиком весь проект, достаточно одного контроллера или модели.
                                          0
                                          Да, есть хорошие генераторы типа github.com/Swiip/generator-gulp-angular и это то, чего очень не хватает.
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Спасибо, заинтересовало

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

                                            Самое читаемое