Цепные часы GruntJS

Учитывая этот образец конфигурации (обратите внимание, что я опустил зависимости, чтобы сделать его кратким):

module.exports = function(grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            dev: {
                files: {
                    'style.css': 'custom.scss'
                }
            },
        },
        watch: {
            options: {
                livereload: true
            },
            css: {
                files: ['css/sass/**/*.scss'] ,
                tasks: ['sass:dev']
            },
            js:{
                files: ['js/**/*.js']
            },
            html:{
                files: ['templates/**/*.html']
            },
            dontRun:{
                files: ['/randomdir/*'],
                tasks:['randomtask']
            }
        }
    });

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

Как я могу запустить часы, которые наблюдают и выполняют css, js and html, но не dontRun?

Я пробовал с:

grunt.registerTask('default', ['watch:css:js:html']);
grunt.registerTask('default', ['watch:css','watch:js','watch:html']);

Но оба они просто выполняют первые часы, вторые и третьи просто не запускаются.


person Jon Snow    schedule 05.03.2014    source источник


Ответы (1)


Это связано с тем, что Grunt может выполнять задачи только последовательно. Таким образом, задача наблюдения может выполняться только с одной целью или со всеми целями.

Однако вы можете использовать задачу динамического псевдонима, чтобы обойти это ограничение:

grunt.registerTask('watchweb', function() {
  // Remove the targets you dont want
  grunt.config('watch.dontRun', null);
  // Then run the watch task after this task is done
  grunt.task.run('watch');
});

Беги с grunt watchweb.

Или более надежное и универсальное решение, которое работает с любой конфигурацией:

// Run with: grunt switchwatch:target1:target2 to only watch those targets
grunt.registerTask('switchwatch', function() {
  var targets = Array.prototype.slice.call(arguments, 0);
  Object.keys(grunt.config('watch')).filter(function(target) {
    return !(grunt.util._.indexOf(targets, target) !== -1);
  }).forEach(function(target) {
    grunt.log.writeln('Ignoring ' + target + '...');
    grunt.config(['watch', target], {files: []});
  });
  grunt.task.run('watch');
});
person Kyle Robinson Young    schedule 05.03.2014