我尝试在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']);
答案 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
这样的任务,它会表现良好。
请注意,所有路径必须是正确的路径,否则,如果任务指定了错误的路径,它将不会运行。