Gulp
Gulp is a development automation tool. It's the successor to Grunt.
We configure gulp using a gulpfile. Our gulpfile contains a set of tasks that we would like to automate. Each task is a stream of activities, for example a js task might:
- Validate your code using JSHint.
- Concatenate your javascript.
- Save it as app.js.
- Reload your web browser so you can see the changes.
- Minify.
- Save the minified code as app.min.js.
Gulp streams
Gulp has a concept of streams. A stream is a set of files that can be transformed.
We create a stream using gulp.src, then pipe it through different functions which can transform the stream in a variety of ways. We can optionally pipe our stream back out onto the filesystem at any point using gulp.dest.
We use gulp for:
- Validation
- Compilation
- Concatenation
- Reformatting
- Renaming
- Wrapping content
Gulp modules
We extend the capabilities of Gulp using modules, which are installed using npm. Here are some useful ones:
- jshint - JavaScript validation
- tshint - TypeScript Static Code Analysis
- sass - CSS precompilation
- uglify - JavaScript minification
- concat - Script concatenation
- autoprefixer - Automatically add vendor prefixes to CSS
- header - Adds a header to the file
- size - Outputs the size of a minified file
Validating code
A common requirement is to validate our JavaScript. We can do this with a simple Gulp task:
var gulp = require('gulp'),
            jshint = require('gulp-jshint');
          
          gulp.task('assets:js', function () {
            return gulp.src(components.js)
              .pipe(jshint())
              .pipe(jshint.reporter('default'))
          }
          We execute this task with:
gulp assets:js
        Exercise - TSLint
We are going to install TSLint for static code analysis of our typescript files.
First Install Gulp and the gulp-cli using npm. Note that currently gulp has to be installed locally in your project, so we omit the -g flag.
npm install gulp --save-dev
          npm install gulp-cli -g
          Test your installation:
gulp --version
          Now we're going to set up gulp to validate our TypeScript. In our project root, install the dependencies using npm:
npm install --save-dev gulp-tslint
          npm install --save-dev tslint
          npm install --save-dev typescript
          Now create a gulpfile containing something like the following:
var gulp = require('gulp'),
            tslint = require('gulp-tslint');
          
          gulp.task('tslint', function () {
            return gulp.src('app/**/*.ts')
              .pipe(tslint())
              .pipe(tslint.report("verbose"))
          });
          tslint.json
You will also need a tslint.json file to tell the linter how to behave, something like the following:
{
              "rules": {
                  "class-name": true,
                  "curly": true,
                  "eofline": false,
                  "forin": true,
                  "indent": [true, 4],
                  "label-position": true,
                  "label-undefined": true,
                  "max-line-length": [true, 140],
                  "no-arg": true,
                  "no-bitwise": true,
                  "no-console": [true,
                    "debug",
                    "info",
                    "time",
                    "timeEnd",
                    "trace"
                  ],
                  "no-construct": true,
                  "no-debugger": true,
                  "no-duplicate-key": true,
                  "no-duplicate-variable": true,
                  "no-empty": true,
                  "no-eval": true,
                  "no-string-literal": false,
                  "no-trailing-whitespace": true,
                  "no-unused-variable": false,
                  "no-unreachable": true,
                  "no-use-before-declare": true,
                  "one-line": [true,
                    "check-open-brace",
                    "check-catch",
                    "check-else",
                    "check-whitespace"
                  ],
                  "quotemark": [true, "single"],
                  "radix": true,
                  "semicolon": true,
                  "triple-equals": [true, "allow-null-check"],
                  "variable-name": false,
                  "whitespace": [true,
                    "check-branch",
                    "check-decl",
                    "check-operator",
                    "check-separator"
                  ]
              }
          }
          Now run gulp tslint to execute the task:
gulp tslint
          Any errors? You may need to introduce an error to see the effect.
Automatic execution
We can tell gulp to watch our filesystem for changes, and execute a task whenever a file is modified.
gulp.task('watch', function() {
            gulp.watch('app/**/*.ts', ['lint']);
          Now we might create a default gulp task:
gulp.task('default', [
            'watch'
          ]);
          We can now set our gulp task running simply by typing gulp at a command line.
gulp
          
        Exercise - Automatic Watching
Set up Gulp to automatically watch all your TypeScript files and execute the linter