Grunt手表不工作

时间:2013-10-05 11:31:41

标签: javascript node.js gruntjs grunt-contrib-watch

我尝试在node.js中通过grunt运行监视任务,但它对我不起作用(这就是我得到的):

$ grunt watch
warning: Maximum call stack size exceeded Use --force to continue.

这是Gruntfile.js中监视任务的一部分:

watch: {
  less: {
    files: 'src/less/*.less',
    tasks: ['clean', 'recess', 'copy']
  },
  js: {
    files: 'src/js/*.js',
    tasks: ['clean', 'jshint', 'concat', 'uglify', 'copy']
  },
  theme: {
    files: 'src/theme/**',
    tasks: ['clean', 'recess', 'copy']
  },
  images: {
    files: 'src/images/*',
    tasks: ['clean', 'recess', 'copy']
  }
}

grunt.loadNpmTasks('grunt-contrib-watch');

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

2 个答案:

答案 0 :(得分:26)

u_mulder是正确的;只需从代码中删除不必要的grunt.registerTask('watch', ['watch'])行,就可以了。

编辑:发生这种情况是因为您正在注册一个自我调用的新任务。添加像grunt.registerTask('watch', ['watch']);这样的行没有意义,因为它已经为您定义了。如果不是这种情况,则必须为Gruntfile配置中的每个任务调用grunt.registerTask

在某些情况下,使用其他名称对任务进行别名可能是有意义的。它将使用您指定的完全相同的配置进行调用,但是别名可以节省输入。例如,我喜欢将available tasks plugin注册为'tasks'别名,因此我可以输入grunt availabletasks而不是键入grunt tasks,这样可以省去一些输入。在这种情况下,您可以执行以下操作:

grunt.registerTask('w', ['watch']);

然后,您可以使用grunt w作为grunt watch的快捷方式。

答案 1 :(得分:2)

实际上,删除grunt.registerTask('watch', ['watch'])会让你感到厌烦。 但是,让我帮助您了解幕后发生的事情。

使用grunt.registerTask('watch', ['watch'])watch调用自身,生成无限循环。 当你删除它时,它仍然有效,因为watch是包的默认任务,我想这是在你grunt.loadNpmTasks('grunt-contrib-watch');文件的初始化时调用的。您可以进一步了解文档here

但是,让您的自定义手表任务按照您的意愿工作会非常方便。要做到这一点,最好做一些像grunt.registerTask('watchfiles', ['watch'])这样的事情。这样就可以避免无限循环并使自定义工作。

你可以运行像$ grunt watchfiles这样的任务,它会表现良好。

请注意,所有路径必须是正确的路径,否则,如果任务指定了错误的路径,它将不会运行。