SlideShare una empresa de Scribd logo
1 de 71
Yeoman Generator своими руками
• Yeoman-генератор: что же это
такое?
• Зачем нужны yeoman-генераторы и
не лучше ли по старинке?
• Как написать свой генератор, с чего
начать, экскурс по граблям
• Демо моего лунапарка.
Мои фанаты часто
спрашивают меня:
«С чего ты взял, что мы
твои фанаты?»
«Кто ты вообще такой?»
Борис Мосунов
Фрилансер,
Веб-разработчик.
Чаще всего разрабатываю
кастомные сайты на WordPress.
Разработал свой фреймворк,
позволяющий писать темы и
плагины для WordPress в парадигме
MVC/OOP
А что бы делать это было проще я
разработал свой yeoman generator
Проблема #1
Нудная работа
Из чего состоит труд
программиста?
Из бесконечной
череды принятия
решений
Из чего состоит труд
программиста?
Из бесконечной
череды принятия
решений
Какие решения мы принимаем?
Какие решения мы принимаем?
Гениальный код
для решения
нетривиальной
задачи
Какие решения мы принимаем?
Гениальный код
для решения
нетривиальной
задачи
Я уже делал такое,
ща поищем,
ctrl+c, ctrl+v,
осталось кое-что
переименовать
Как мы себя при этом чувствуем?
Я - повелитель кода…
ctrl + c ctrl + c
ctrl + v ctrl + v
Как в реальности?
Гениальный код
для решения
нетривиальной
задачи
Я уже делал такое,
ща поищем,
ctrl+c, ctrl+v,
осталось кое-что
переименовать
Хорошо если хотя бы так
Рутина утомляет и демотивирует
Проблема #2
Слишком много няшек
и все надо сконфигурировать
Корневая папка моего
среднестатистического
проекта
Проблема #3
Конкурентоспособность
15 ноября 2014 - oDesk: больше не будет демпинга по $1/час!!!
Вывод: чтобы конкурировать,
надо успевать больше за меньшее время
Спасение - yeoman.io
A yeoman was a social
class in late medieval to
early modern England. In
early recorded uses, a
yeoman was an attendant
in a noble household.
Wikipedia
THE WEB'S
SCAFFOLDING TOOL
FOR MODERN
WEBAPPS
yeoman.io
scaffolding - строительные леса
yeoman - утилита для генерации пустого проекта
по заданному сценарию
yeoman generator - программная реализация
такого сценария генерации пустого проекта
Запуск: yo <generator>
yo - сокращение от yeoman,
название исполняемого файла
yeoman subgenerator - вспомогательный сценарий
по генерации модулей, блоков, моделей и т.д.
Запуск: yo <generator>:<subgenerator> <name>
scaffolding
tool
build
system
package
manager
YO stack
Workflow
Demo
npm install -g yo bower grunt-cli gulp
npm install -g generator-webapp
mkdir my-yo-project
cd my-yo-project
yo webapp
http://yeoman.io/learning/index.html
Готовых генераторов много!
Demo
npm install -g yo bower grunt-cli gulp
npm install -g generator-webapp
mkdir my-yo-project
cd my-yo-project
yo webapp
http://yeoman.io/learning/index.html
webapp
npm install -g yo bower grunt-cli gulp
npm install -g generator-webapp
mkdir my-yo-project
cd my-yo-project
yo webapp
http://yeoman.io/learning/index.html
Angular.js
npm install -g yo bower grunt-cli gulp
npm install -g generator-angular
mkdir my-yo-project
cd my-yo-project
yo angular
http://yeoman.io/learning/index.html
Backbone.js
npm install -g yo bower grunt-cli gulp
npm install -g generator-backbone
mkdir my-yo-project
cd my-yo-project
yo backbone
http://yeoman.io/learning/index.html
MEAN.js
npm install -g yo bower grunt-cli gulp
npm install -g generator-meanjs
mkdir my-yo-project
cd my-yo-project
yo meanjs
http://yeoman.io/learning/index.html
Chrome Extension
npm install -g yo bower grunt-cli gulp
npm install -g generator-chrome-extension
mkdir my-yo-project
cd my-yo-project
yo chrome-extension
http://yeoman.io/learning/index.html
…но, допустим, хочется свой… YO генератор…
Как хороший 3D-принтер должен уметь
распечатать другой 3D принтер…
…так должен быть и YO-генератор,
который генерирует YO-генератор
npm install -g generator-generator
yo generator
Генератор с нуля подробно здесь:
http://yeoman.io/authoring/
npm install -g generator-generator
yo generator
yo generator:subgenerator <name>
npm link
yo my-generator
npm -g unlink generator-my-generator
Демо: YO-генератор с нуля
Структура папок
генератор = сценарий + шаблоны кода и конфигов
директория генератора
шаблоны кода и конфигов
сценарий генератора
Сценарий генератора
инициализация
чего изволите?
генерация кода,
разрешение
конфликтов,
запись на диск
установка:
npm install
bower install
require(‘inquirer’)
require(‘mem-fs’)
require(‘underscore.string’)
inquirer - библиотека для создания консольного «опросника»
inquirer.js - типы инпутов:
Confirm - { type: "confirm" }
Input - { type: "input" }
Password - { type: "password" }
inquirer.js - типы инпутов:
List - { type: "list" }
Raw List - { type: "rawlist" }
inquirer.js - типы инпутов:
Expand - { type: "expand" }
inquirer.js - типы инпутов:
Checkbox - { type: "checkbox" }
inquirer.js - структура вопроса:
mem-fs - файловая система «in memory»
во время работы сценария, все изменения
файловой системы пишутся в память.
по окончании работы сценария
идет сравнение файлов на диске и в памяти
и срабатывает механизм разрешения конфликтов
файловая система у YO - синхронная
Работает с двумя папками:
generator.templatePath()
generator.destinationPath()
underscore.string
capitalize("foo Bar") => "Foo Bar"
decapitalize("Foo Bar") => "foo Bar"
camelize("moz-transform") => "mozTransform"
classify("some_class_name") => "SomeClassName"
underscored("MozTransform") => "moz_transform"
dasherize("MozTransform") => "-moz-transform"
humanize(" capitalize dash-CamelCase_underscore trim ")
=> "Capitalize dash camel case underscore trim"
slugify("Un éléphant à l'orée du bois")
=> "un-elephant-a-l-oree-du-bois"
Gruntfile API
gruntfile.insertConfig( name, config )
gruntfile.registerTask( name, tasks )
npm & bower API
generator.npmInstall()
generator.bowerInstall()
generator.installDependencies()
chalk + yosay
Генераторы,
сабгенераторы и
другие генераторы
http://yeoman.io/authoring/composability.html
this.composeWith('backbone:route', {
options: {
rjs: true
}
});
Генератор может использовать
другой генератор или сабгенератор
А стоит ли?
свои сабгенераторы - да
чужие генераторы - нет
Демо: Мой лунапарк
Грабли
Грабли
mem-fs:
Если использовать composeWith(),
учтите, что у каждого генератора своя
файловая система в памяти.
Грабли
mem-fs:
На данный момент yeoman использует
параллельно два api:
• новое (this.fs.)
• и legacy (this.).
Это порождает путаницу.
Лучше сделать обертку, как я :)
Грабли
Каждой отдельной фиче - свой сабгенератор,
иначе конструкции inquirer.js начинают
напоминать многотомные текстовые квесты.
Как у меня :(
Выводы
1. Готовыми генераторами стоит пользоваться, это экономит
время, силы и нервы.
2. Изучение новых фреймворков стоит начинать с поиска
генераторов
3. Написание своего генератора отнимает много сил и времени -
программирование в квадрате. Поэтому писать его стоит только
если вы точно знаете что впереди у вас очень много
повторяющейся работы.
4. Если вы написали свой фреймворк, продвинуть его получится
значительно быстрее, если сделать для него yeoman-generator
5. Наличие генератора помогает поддерживать единообразие кода
и следование стайлгайдам.
Задавайте свои вопросы!
Борис Мосунов
borix@tut.by
skype: boris.mossounov
fb: mossounov
tw: @chaykaborya
anotherguru.me
Мой сайт,
сделанный на моем фреймворке
с помощью моего yeoman генератора

Más contenido relacionado

La actualidad más candente

TestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщикаTestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщика
davertmik
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Глеб Тарасов
 
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
Yandex
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
Ontico
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Глеб Тарасов
 

La actualidad más candente (20)

Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Ansible on a great Moscow DevOps CM battle
Ansible on a great Moscow DevOps CM battleAnsible on a great Moscow DevOps CM battle
Ansible on a great Moscow DevOps CM battle
 
WP Kitchen Meetup Spring 2015 - Виктор Кулебякин: WordPress JavaScript Utils
WP Kitchen Meetup Spring 2015 - Виктор Кулебякин: WordPress JavaScript UtilsWP Kitchen Meetup Spring 2015 - Виктор Кулебякин: WordPress JavaScript Utils
WP Kitchen Meetup Spring 2015 - Виктор Кулебякин: WordPress JavaScript Utils
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
BDD in Codeception
BDD in CodeceptionBDD in Codeception
BDD in Codeception
 
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
 
Project migration while changing publisher: saving time and data
Project migration while changing publisher: saving time and dataProject migration while changing publisher: saving time and data
Project migration while changing publisher: saving time and data
 
TestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщикаTestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщика
 
bem.info — движок и сайт — Андрей Кузнецов, Яндекс
bem.info — движок и сайт — Андрей Кузнецов, Яндексbem.info — движок и сайт — Андрей Кузнецов, Яндекс
bem.info — движок и сайт — Андрей Кузнецов, Яндекс
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукАсинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
 
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"
 
SMART Notebook в Linux
SMART Notebook в LinuxSMART Notebook в Linux
SMART Notebook в Linux
 
PowerShell
PowerShellPowerShell
PowerShell
 
Codeception UATestingDays
Codeception UATestingDaysCodeception UATestingDays
Codeception UATestingDays
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
 
Chef
ChefChef
Chef
 
Презентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьПрезентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начать
 

Destacado

Destacado (9)

Браузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачемБраузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачем
 
Методологии верстки
Методологии версткиМетодологии верстки
Методологии верстки
 
Что такое Docker
Что такое DockerЧто такое Docker
Что такое Docker
 
React и redux
React и reduxReact и redux
React и redux
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
Web app syncronizations, Sockets, tricks and hacks
Web app syncronizations, Sockets, tricks and hacks Web app syncronizations, Sockets, tricks and hacks
Web app syncronizations, Sockets, tricks and hacks
 
Приёмы функционального программирования в обычном JavaScript
Приёмы функционального программирования в обычном JavaScriptПриёмы функционального программирования в обычном JavaScript
Приёмы функционального программирования в обычном JavaScript
 
А готов ли ваш проект к лету?
А готов ли ваш проект к лету?А готов ли ваш проект к лету?
А готов ли ваш проект к лету?
 
Performance: в борьбе за миллисекунды
Performance: в борьбе за миллисекундыPerformance: в борьбе за миллисекунды
Performance: в борьбе за миллисекунды
 

Similar a Yeoman generator своими руками

евгений потапов Root Conf потапов
евгений потапов Root Conf   потаповевгений потапов Root Conf   потапов
евгений потапов Root Conf потапов
rit2010
 
Evgeniy Potapov Root Conf потапов
Evgeniy Potapov Root Conf   потаповEvgeniy Potapov Root Conf   потапов
Evgeniy Potapov Root Conf потапов
rit2010
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
mcslayer
 
Разработка на блокчейн Голос | Ерлан Шиндаулетов
Разработка на блокчейн Голос | Ерлан ШиндаулетовРазработка на блокчейн Голос | Ерлан Шиндаулетов
Разработка на блокчейн Голос | Ерлан Шиндаулетов
Cyber Fund
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
Dmitry Buzdin
 

Similar a Yeoman generator своими руками (20)

Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
Попасть в мишень
Попасть в мишеньПопасть в мишень
Попасть в мишень
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
 
евгений потапов Root Conf потапов
евгений потапов Root Conf   потаповевгений потапов Root Conf   потапов
евгений потапов Root Conf потапов
 
Evgeniy Potapov Root Conf потапов
Evgeniy Potapov Root Conf   потаповEvgeniy Potapov Root Conf   потапов
Evgeniy Potapov Root Conf потапов
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
 
Разработка на блокчейн Голос | Ерлан Шиндаулетов
Разработка на блокчейн Голос | Ерлан ШиндаулетовРазработка на блокчейн Голос | Ерлан Шиндаулетов
Разработка на блокчейн Голос | Ерлан Шиндаулетов
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
BEM на корпоративном веб-ресурсе — отказоустойчивость фронтенда
BEM на корпоративном веб-ресурсе — отказоустойчивость фронтендаBEM на корпоративном веб-ресурсе — отказоустойчивость фронтенда
BEM на корпоративном веб-ресурсе — отказоустойчивость фронтенда
 
BEM for corporate sites — failover frontend
BEM for corporate sites — failover frontendBEM for corporate sites — failover frontend
BEM for corporate sites — failover frontend
 
Codeception Introduction
Codeception IntroductionCodeception Introduction
Codeception Introduction
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 

Más de chaykaborya

Más de chaykaborya (6)

AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)
 
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox ExtensionОранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
 
Orange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox ExtensionOrange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox Extension
 
Особенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page ApplicationОсобенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page Application
 
How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...
 
Wordpress promo
Wordpress promoWordpress promo
Wordpress promo
 

Yeoman generator своими руками