Grunt watch无法工作

9

我尝试在node.js中使用Grunt运行"watch"任务,但是它并没有正常工作(这是我的结果):

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

1
我认为这会有所帮助 https://dev59.com/xXPYa4cB1Zd3GeqPfihs - u_mulder
2个回答

27

u_mulder是正确的,只需从您的代码中删除不必要的grunt.registerTask('watch', ['watch'])一行即可解决问题。

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

在某些情况下,给任务取一个不同的名称可能有意义。它将使用您指定的完全相同的配置来调用,并且别名可能会节省打字。例如,我喜欢使用“tasks”别名注册我的available tasks plugin,这样我就可以输入grunt tasks而不是grunt availabletasks,这为我节省了一些时间。在这种情况下,您可以像这样做:

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

你可以使用grunt w作为grunt watch的快捷方式。


2
实际上,删除grunt.registerTask('watch',['watch'])就可以解决问题。但是让我帮助您理解发生了什么。
使用grunt.registerTask('watch',['watch'])watch会调用自己,从而生成无限循环。当您将其删除时,它仍然可以工作,因为watch是该软件包的默认任务,我猜在文件的开头使用grunt.loadNpmTasks('grunt-contrib-watch');调用该任务。您可以在此处进一步查看文档。
但是,最好使您自定义的观察任务按您想要的方式工作。为此,可能最好做一些类似于grunt.registerTask('watchfiles',['watch'])的操作。这样,您就可以避免无限循环,并使您的自定义功能正常工作。
您可以像这样运行任务:$ grunt watchfiles,它会正常执行。
请注意,所有路径必须是正确的,否则,如果任务指定了错误路径,它将不会运行。

Ben,请重现这些步骤,然后我们可以聊一下。 这里提出的问题不是理论上的,而是阻碍了开发人员执行grunt任务的实际问题。 因此,应该从实际角度来解决它。 你的评论没有帮助澄清问题。 如果你重现错误,你也会得到无尽的循环。即使我错了,也不会真正有影响,因为你将为我们所有人提供更多关于这个“黑暗”的信息。谢谢! - 2682562

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接