Одновременно запускайте watch и nodemon с помощью Grunt.

Я только начинаю работать с Grunt и хотел бы запускать grunt-contrib-watch [страница GitHub], чтобы каждый раз анализировать мой JavaScript. файл изменен (с grunt-contrib-jshint [страница GitHub]) и запускается grunt-nodemon [страница GitHub], одновременно используя grunt-concurrent [страницу GitHub].

Насколько я понимаю (чего я, очевидно, не понимаю), мой Gruntfile должен:

  1. Запустить concurrent по умолчанию
  2. concurrent работает watch
  3. watch запускается jshint каждый раз при изменении файла

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

Н.Б. Я еще не добавил grunt-nodemon в смесь.

Похоже, что concurrent работает watch, но когда я изменяю файл, оказывается, что jshint не работает. Я, конечно, не получаю никакого вывода в Терминале (я думал, что logConcurrentOutput: true делает это).

Вот вывод, который я получаю в терминале:

Running "concurrent:dev" (concurrent) task
Running "watch" task
Waiting...    


Done, without errors.

Я также хотел бы запустить jshint при первом запуске задачи default (а также при изменении файлов).

Может ли кто-нибудь пролить свет на то, где я ошибаюсь?

Спасибо!


person Jonathon Oates    schedule 31.01.2014    source источник


Ответы (3)


Задача watch завершается, если не найдены файлы для «просмотра»; согласно этой проблеме.

Чтобы легко указать watch просматривать те же файлы, что и задача jshint, я использовал механизм шаблонов Grunt для ссылки на те же Array файлов, что и задача jshint.

Затем я добавил jshint в список одновременных задач для запуска, чтобы он запускался изначально и по мере изменения файлов (с watch).

Вот мой рабочий 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'
    ]);
};
person Jonathon Oates    schedule 31.01.2014

Если вы используете сервер Express, вы можете использовать grunt-express-server. В документации есть хорошее руководство по использованию этого с JSHINT и LiveReload + Watch/Regarde.

grunt.initConfig({
    jshint: {
      all: ['Gruntfile.js', 'public/javascripts/*.js', 'test/**/*.js']
    },
    watch: {
      express: {
        files: ['**/*.js', '**/*.ejs'],
        tasks: ['jshint', 'express:dev'],
        options: {
          spawn: false
        }
      }
    },
    express: {
      dev: {
        options: {
          script: './app.js'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-express-server');
  grunt.loadNpmTasks('grunt-contrib-watch');

  // Default task(s).
  grunt.registerTask('server', [ 'express:dev', 'watch' ]);
});
person Asta    schedule 07.04.2014

Джонатон, вам нужно убедиться, что ваш шаблон подстановки действительно соответствует любым файлам. Как следует из ссылки на проблему, вы можете попробовать вариант nonull. Я бы также посоветовал запустить grunt с флагом --debug, чтобы вы могли видеть больше того, что происходит под капотом.

Это работающий файл Grunt, который запускает сервер узла, следит за изменениями и выполняет перезагрузку. Он использует подключаемый модуль grunt-express.

person thanpolas    schedule 31.01.2014