Gulp используется для development окружения моего проекта, поэтому я прописал необходимые для моего пакета зависимости в package.json:

{
  "name": "vtree",
  "version": "0.1.2-alpha",
  "author": "Sergey Shishkalov <sergeyshishkalov@gmail.com>",
  "description": "Library for automated initialization of backbone views",
  "devDependencies": {
    "coffee-script": "",
    "gulp": "~3.6.2",
    "gulp-util": "",
    "gulp-coffee": "",
    "gulp-concat": "",
    "gulp-uglify": "",
    "gulp-header": "",
    "gulp-rename": "",
    "coffeegulp": ""
  },
  "engine": {
    "node": ">= 0.10"
  },
  "scripts": {
    "test": "./node_modules/grunt-cli/bin/grunt karma:ci"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "http://github.com/npm/npm.git"
  }
}

Здесь в списке необходимых зависимостей сам gulp, несколько плагинов для него и обертка coffeegulp для возможности использовать кофескрипт в gulpfile. Небольшое описание плагинов:

  1. gulp-util — различные вспомогательные утилиты, например, для возможности логировать ошибки во время выполнения таска,
  2. gulp-coffee — возможность билдить проект из кофескрипт-файлов,
  3. gulp-concat — склеивает несколько файлов в один,
  4. gulp-uglify — минифицирует файлы,
  5. gulp-header — возможность сделать красивый хедер-баннер с инфой об авторе, лицензии и т.д.,
  6. gulp-rename — позволяет динамически модифицировать название получившегося файла.

Сам гульп ставим глобально, чтобы его бинарники прописались в наш системный load path, остальные пакеты можно установить и локально:

npm install -g gulp
npm install

Теперь пример gulpfile.coffee:

gulp = require('gulp')
gutil = require('gulp-util')
coffee = require('gulp-coffee')
concat = require('gulp-concat')
header = require('gulp-header')
uglify = require('gulp-uglify')
rename = require('gulp-rename')
 
projectHeader = '/*! Vtree (v0.1.2),\n
                simple library for creating complicated architectures,\n
                by Sergey Shishkalov <sergeyshishkalov@gmail.com>\n
                <%= new Date().toDateString() %> */\n'
 
gulp.task 'build', ->
  gulp
    .src([
      'src/modula.coffee',
      'src/configuration.coffee',
      'src/vtree.coffee',
      'src/vtree_src/hooks.coffee',
      'src/vtree_src/vtree_nodes_cache.coffee',
      'src/vtree_src/node.coffee',
      'src/vtree_src/node_data.coffee',
      'src/vtree_src/node_wrapper.coffee',
      'src/vtree_src/tree_manager.coffee',
      'src/vtree_src/launcher.coffee',
      'src/vtree_src/dom.coffee'
    ])
    .pipe(coffee(bare: false).on('error', gutil.log))
    .pipe(concat('vtree.js'))
    .pipe(header(projectHeader))
    .pipe(gulp.dest('build/'))
 
gulp.task 'minify', ['build'], ->
  gulp.src('build/vtree.js')
    .pipe(uglify(outSourceMap: false))
    .pipe(rename(suffix: '.min'))
    .pipe(header(projectHeader))
    .pipe(gulp.dest('build/'))
 
gulp.task 'prepare', ['minify']

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

Делается это следующей командой.

coffeegulp prepare

Получилось немного скомкано. В общем, крутая штука этот гульп. А тем, кто дочитал до конца, оставляю подарок — настроенное окружение для создания крутых js-библиотек (из коробки интеграция с TravisCI, настроенные таски для TDD, билда из исходников полной и минифицированной версий, bower.json, package.json и т.д.).