grunt-contrib-watch livereload 35729 livereload.js не загружается

Я использую grunt-contrib-watch 0.6.1 и включил блоки livereload в свой файл gruntfile.js. Я также включил вызов livereload.js в свой html:

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

Когда я запускаю сервер с помощью моей среды разработки, все запускается правильно.

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

Когда я вношу изменения, я вижу, что сервер перезагружается в моей консоли ssh, но livereload.js не загружается:

Когда я перехожу к порту, где он должен быть http://myste.com:35729/livereload.js Я получаю стандартный ответ "веб-страница недоступна". Также кажется, что сервер на http://myste.com:35729/ вообще не работает.

Я также включаю сюда мой gruntfile.js для полноты картины.

'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']);
};

person Finglish    schedule 03.12.2014    source источник
comment
Вы запускаете concurent task, который включает watch и nodemon задачи, а затем снова запускаете эти задачи. Это может вызвать у вас проблемы. Проверьте, что произойдет, если вы удалите их из объявления grunt dev   -  person Glen Swift    schedule 03.12.2014
comment
@GlenSwift спасибо за предложение. Я попытался удалить их из объявления разработчика, но тогда сервер не запускается. Я также попытался удалить concurrent из dev, сервер загружен, но доступ к livereload все еще отсутствует.   -  person Finglish    schedule 03.12.2014
comment
Хм, вот мой пример параллельной задачи: concurrent: { tasks: ['nodemon', 'watch'], options: { logConcurrentOutput: true } } Я запускаю ее с grunt и не запускаю watch и nodemon отдельно. Я не уверен, что это будет полезно, но вы можете попробовать? Он отлично работает для меня.   -  person Glen Swift    schedule 04.12.2014
comment
@GlenSwift Да! ты прав. Ваш вариант сработал.   -  person Finglish    schedule 04.12.2014


Ответы (1)


Вы пытаетесь запустить задачи nodemon и watch дважды. Во-первых, когда вы запускаете concurrent задачу, а во-вторых, когда вы сами вызываете.

Измените конфигурацию задачи concurrent на

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

И удалите лишние задачи из объявления grunt dev:

grunt.registerTask('dev', ['env:dev', 'concurrent', 'jshint', 'nodeunit', 'sass']);
person Glen Swift    schedule 03.12.2014