Gruntjs Grunt contrib监视目标和递归

Gruntjs Grunt contrib监视目标和递归,gruntjs,grunt-contrib-watch,Gruntjs,Grunt Contrib Watch,我正在试图找出一种方法,从块的其余部分分离出一个监视目标。当前我的监视目标如下所示: watch: { options: { // Parent-level options }, coffee: { // ... }, stylus: { // ... }, test: { options: { // Test-specific options }, files: { // ... }

我正在试图找出一种方法,从块的其余部分分离出一个
监视
目标。当前我的监视目标如下所示:

watch: {
  options: {
    // Parent-level options
  },
  coffee: {
    // ...
  },
  stylus: {
    // ...
  },
  test: {
    options: {
      // Test-specific options
    },
    files: {
      // ...
    }
    tasks: {
      // ...
    }
  }
}
var _ = require('lodash');

module.exports = function(grunt) {
    // 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 !(_.indexOf(targets, target) !== -1);
        }).forEach(function(target) {
            grunt.log.writeln('Ignoring ' + target + '...');
            grunt.config(['watch', target], {files: []});
        });
        grunt.task.run('watch');
    });
}
我面临的问题是,我的测试选项包括一个与顶级不同的livereload端口,因此我可以同时运行
grunt服务器
grunt测试
,并使用
livereload
ing,而不让它们相互干扰

在这下面,我有一个
服务器
别名和一个
测试
别名。我要寻找的是将
测试
监视目标分解到另一个任务中,这样我就可以在服务器别名中运行
监视
,并执行类似于
监视测试
的测试,这样服务器任务就不会运行测试目标

有什么想法吗?如果我遗漏了任何重要的内容或不清楚的内容,请告诉我。
谢谢

由于grunt watch是一个多任务,因此从CLI运行
grunt watch
意味着监视所有目标。您可以通过简单地运行
grunt-watch:test
grunt-watch:server
来运行这些目标中的一个,无论您喜欢什么。希望有帮助

编辑:在观察问题跟踪程序上指出此问题可能是适当的:

本期中的代码有点旧,我建议使用更新的代码来要求lodash,并使用
\u
而不是
grunt.util.\u
(该实用程序现在已被弃用)。因此,代码如下所示:

watch: {
  options: {
    // Parent-level options
  },
  coffee: {
    // ...
  },
  stylus: {
    // ...
  },
  test: {
    options: {
      // Test-specific options
    },
    files: {
      // ...
    }
    tasks: {
      // ...
    }
  }
}
var _ = require('lodash');

module.exports = function(grunt) {
    // 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 !(_.indexOf(targets, target) !== -1);
        }).forEach(function(target) {
            grunt.log.writeln('Ignoring ' + target + '...');
            grunt.config(['watch', target], {files: []});
        });
        grunt.task.run('watch');
    });
}
不过,您可以修改服务器任务以运行类似于
switchwatch:coffee:stylus:server

grunt.registerTask('server', [/* rest of your tasks */, 'switchwatch:coffee:stylus:server']);

我使用的一种解决方案是定义多个监视目标并重命名监视任务,如下所示:

watch: {
    scripts: {
        files: ['js/**/*.js'],
        tasks: ['concat', 'uglify'],
        options: {
            spawn: false
        }
    }
},

// Don't uglify in dev task
watchdev: {
    scripts: {
        files: ['js/**/*.js'],
        tasks: ['concat'],
        options: {
            spawn: false
        }
    }
}

grunt.loadNpmTasks('grunt-contrib-watch');
// Rename watch to watchdev and load it again
grunt.renameTask('watch', 'watchdev');
grunt.loadNpmTasks('grunt-contrib-watch');

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

谢谢,但我不是直接从CLI调用watch任务,而是从别名任务
服务器
测试
(Yeoman是如何设置的)调用watch任务。因此,本质上我希望
grunt服务器
在没有
test
目标的情况下运行
watch
任务(从而监视多个目标),并且
grunt test
运行
watch:test
。这有意义吗?再次感谢!