Concurrently Run `watch` & `nodemon` with Grunt

gruntjs, jshint, node.js, nodemon, watch

Solution

The `watch` task exits if there are no files found to 'watch'; as per this issue.

To easily tell `watch` to watch the same files as the `jshint` task I used Grunt's templating engine to reference the same `Array` of files as the `jshint` task.

I then added `jshint` to the list of concurrent tasks to run so it would be ran initially and as I modify files (with `watch`).

Here is my working `Gruntfile`:

module.exports = function (grunt) {
    grunt.initConfig({
        concurrent: {
            dev: [
                'jshint',
                'watch'
            ],
            options: {
                logConcurrentOutput: true
            }
        },
        jshint: {
            server: [
                '**/*.js',
                '!node_modules/**/*.js'
            ],
            options: {
                node: true
            }
        },
        watch: {
            files: '<%= jshint.server %>',
            tasks: [
                'jshint'
            ]
        }
    });

    grunt.loadNpmTasks('grunt-concurrent');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-watch');

    grunt.registerTask('default', [
        'concurrent'
    ]);
};

Problem

I'm just getting started with Grunt and would like to run `grunt-contrib-watch` [GitHub page] to lint my JavaScript every time a file is modified (with `grunt-contrib-jshint` [GitHub page]) and run `grunt-nodemon` [GitHub page] too, concurrently using `grunt-concurrent` [GitHub page]. As I understand (which I evidently don't) my Gruntfile should: - Run `concurrent` by default - `concurrent` runs `watch` - `watch` runs `jshint` every time a file is modified `Gruntfile.js` ``` module.exports = function (grunt) { grunt.initConfig({ concurrent: { dev: [ 'watch' ], options: { logConcurrentOutput: true } }, jshint: { server: [ '**/*.js', '!node_modules/**/*.js' ], options: { node: true } }, watch: { all: [ '**/*/.js', '!node_modules/**/*.js' ], tasks: [ 'jshint' ] } }); grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.registerTask('default', [ 'concurrent:dev'/*, 'jshint', 'watch'*/ ]); }; grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.registerTask('default', [ 'concurrent:dev' ]); }; ``` N.B. I've not added `grunt-nodemon` into the mix yet. It looks like `concurrent` is running `watch` but when I modify a file it appears `jshint` isn't running. I certainly don't get any output in the Terminal (I thought `logConcurrentOutput: true` does this). Here is the output I get in the Terminal: ``` Running "concurrent:dev" (concurrent) task Running "watch" task Waiting... Done, without errors. ``` I would also like to run `jshint` when I first run the `default` task (as well as when I modify files). Can anyone shed some light on where I am going wrong? Thanks!

Original source