Каким вы видите себе идеальный процесс сборки-тестирования-запуска-деплоя веб-сервиса?
Предположим, у нас имеется веб-сервер, написанный на
Node.js. В качестве менеджера пакетов используется
npm, а в качестве системы сборки --
Gulp.
Фронтенд написан на JS и использует
Bower для управления зависимостями.
Какие шаги необходимо проделать для запуска работоспособной версии из исходников:
Установить Node.js
Установить зависимости npm и Bower'а
Прогнать тесты
(Опционально) "Минимизировать" JS и CSS файлы, сжать изображения и прочее
Запустить веб-сервер
Первый вопрос -- какие из этих тасков, по вашему мнению, должна осуществлять непосредственно build system, и почему?
Предлагаю пройтись по пунктам.
Первый шаг (установка Node.js) в любом случае решается пользователем (установкой из exe / msi / apt-get / etc), на систему сборки это возлагать не надо.
Второй шаг (установка зависимостей npm и Bower'а) может уже решаться как системой сборки (в данном случае Gulp), так и снова ложиться на плечи пользователя. Казалось бы, первый вариант предпочтительнее (как минимум в таком случае инкапсулируется информация о конкретных менеджерах пакетов), но тогда мы должны попросить пользователя отдельно поставить Gulp (npm install gulp), что в любом случае нарушит упомянутую в качестве плюса инкапсуляцию.
Тесты практически однозначно должна брать на себя система сборки. Пусть пользователь вызывает "gulp test" и не запаривается на тему того, что в следующих версиях test framework сменится с Mocha на какой-нибудь Expresso.
Минимизация JS и CSS файлов тоже однозначно является задачей системы сборки (в противном случае пользователю надо будет знать слишком много деталей реализации).
Запуск же веб-сервера, напротив, чисто задача пользователя. Gulp занимается сборкой, пользователь -- запуском того, что Gulp насобирал.
Второй вопрос заключается в уровне абстрации. Например, установка зависимостей необязательно должна "торчать" наружу, это вполне может быть кастомный скрипт из package.json:
"scripts": {
"install-deps": "npm install && bower install"
}
, который пользователь будет запускать по выполнению команды "npm run install-deps".
Или в случае использования Gulp'а в проекте маневрирование пользователем npm напрямую -- в любом случае моветон, и надо говорить пользователю делать "gulp install-deps"? Насколько сильно желательно "огородить" пользователя от npm в сторону Gulp?
Ну и наконец, посоветуйте какие-нибудь публичные репозитории с грамотной структурой всего этого дела.