1
votes

I am running grunt-contrib-watch 0.6.1 and have included livereload blocks in my gruntfile.js. I also included livereload.js call in my html:

<script type="text/javascript" src="http://myste.com:35729/livereload.js"></script>

When I run the server using my dev env everything seems to start correctly.

grunt dev
Running "env:dev" (env) task

Running "concurrent:dev" (concurrent) task

Running "nodemon:dev" (nodemon) task
[nodemon] v1.2.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node server.js`

Application Started on port 3000

When I make a change I can see the server reload in my ssh console, but livereload.js fails to load:

When I go to the port location where it should be http://myste.com:35729/livereload.js I get the standard "webpage not available" response. There also seems to be no server running on http://myste.com:35729/ at all.

I also include my gruntfile.js here for completeness

'use strict';

module.exports = function (grunt) {
    var watchFiles = {
        serverViews: ['app/views/**/*.*'],
        serverJS: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js'],
        clientViews: ['public/views/**/*.html'],
        clientJS: ['public/js/**/*.js'],
        clientSASS: 'public/styles/sass/**/*.{scss,sass}',
        clientCSS: ['public/styles/css/**/*.css']
    };

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        env: {
            dev: {
                NODE_ENV: 'development'
            },
            prod: {
                NODE_ENV: 'production'
            }
        },
        watch: {
            serverViews: {
                files: watchFiles.serverViews,
                options: {
                    livereload: true
                }
            },
            serverJS: {
                files: watchFiles.serverJS,
                tasks: ['jshint'],
                options: {
                    livereload: true
                }
            },
            clientViews: {
                files: watchFiles.clientViews,
                options: {
                    livereload: true,
                }
            },
            clientJS: {
                files: watchFiles.clientJS,
                tasks: ['jshint'],
                options: {
                    livereload: true
                }
            },
            clientSASS: {
                files: watchFiles.clientSASS,
                tasks: ['sass:dev'],
                options: {
                    livereload: true,
                    spawn: false
                }
            },
            clientCSS: {
                files: watchFiles.clientCSS,
                tasks: ['csslint'],
                options: {
                    livereload: true
                }
            },
        },

        nodemon: {
            dev: {
                script: 'server.js'
            }
        },

        nodeunit: {
            dev: {
                all: ['app/test/**/*_test.js'],
                options: {
                    reporter: 'tap',
                    reporterOutput: 'tests.tap',
                    reporterOptions: {
                        output: 'outputdir'
                    }
                }
            }
        },

        jshint: {
            dev: {
                all: {
                    src: watchFiles.clientJS.concat(watchFiles.serverJS),
                    options: {
                        jshintrc: true
                    }
                }
            }
        },

        uglify: {
            prod: {
                my_target: {
                    files: {
                        'public/js/all.min.js': ['public/js/library/jquery.js', 'public/js/library/modernizr.js', 'public/js/library/selectivizr.js', 'public/js/library/delfin.js']
                    }
                }
            }
        },

        sass: {
            dev: {
                options: {
                    style: 'expanded'
                },
                files: {
                    'public/styles/css/style.css': 'public/styles/scss/style.scss' // 'destination': 'source'
                }
            }
        },

        cssmin: {
            prod: {
                files: {
                    'public/styles/css/style.min.css': 'public/styles/css/style.css'
                }
            }
        },

        csslint: {
            dev: {
                options: {
                    csslintrc: '.csslintrc',
                },
                all: {
                    src: watchFiles.clientCSS
                }
            }
        },

        concurrent: {
            dev: {
                target: {
                    tasks: ['nodemon', 'watch'],
                    options: {
                        logConcurrentOutput: true
                    }
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-csslint');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-nodeunit');
    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-express-server');
    grunt.loadNpmTasks('grunt-concurrent');
    grunt.loadNpmTasks('grunt-nodemon');
    grunt.loadNpmTasks('grunt-env');

    grunt.registerTask('dev', ['env:dev', 'concurrent', 'nodemon', 'watch', 'jshint', 'nodeunit', 'sass']);
    grunt.registerTask('prod', ['env:prod', 'cssmin', 'uglify', 'nodemon']);
};
1
You're running concurent task that includes watch and nodemon tasks and then running this tasks again. It may cause you problem. Check what's happen if your remove them from grunt dev declarationGlen Swift
@GlenSwift thanks for the suggestion. I tried removing them from the dev declaration, but then the server doesn't start. I also tried removing concurrent from dev, the server loaded but the livereload access is still missing.Finglish
Hm, Here is my instance of concurrent task: concurrent: { tasks: ['nodemon', 'watch'], options: { logConcurrentOutput: true } } I run it with grunt and do not run watch and nodemon seperately. I am not sure this will be helpful but can you try? It works perfectly for me.Glen Swift
@GlenSwift Yes! you are right. Your version worked.Finglish

1 Answers

2
votes

You try to run nodemon and watch tasks twice. First, when you run concurrent task and second when you call themselves.

Change your concurrent task config to

concurrent: {
    tasks: ['nodemon', 'watch'],
    options: {
        logConcurrentOutput: true
    }
},

And remove extra tasks from grunt dev declaration:

grunt.registerTask('dev', ['env:dev', 'concurrent', 'jshint', 'nodeunit', 'sass']);