Grunt在错误修正后无法运行Less文件监测

13

目前 Grunt Watch 在编译错误更正后无法重新运行任务,我遇到了这个问题。

我收到了错误信息,但是在更正错误后,grunt 说文件已更改,但此时没有运行任何任务。

Grunt 文件:

watch: {
        less: {
            files: ['public/assets/less/**/*.less'],
            tasks: ['css'],
            options: {
                atBegin: true,
                nospawn: true
            }
        },
        scripts: {
            files: [
                'public/assets/js/homepage.js'
            ],
            tasks: ['jsApp'],
            options: {
                nospawn: true,
            }
        }
    },

错误日志:

>> ParseError: Unrecognised input in public/assets/less/template.less on line 114, column 31:
>> 114         @media screen and (max-width: 767px) {
>> 115             left: 0;
Warning: Error compiling public/assets/less/main.less
// ----- Corrected the file here, saved again -----
>> File "public/assets/less/template.less" changed.

文件结束。此点后无任何内容。


我也遇到了这个问题,但无论在哪里都找不到相关信息。如果你找到解决方案,请务必告诉我。如果你将nospawn设置为false,这个问题就不再存在了,但对我来说,这会使LESS编译变慢1.5秒,非常烦人。 - Craig Barben
你能否发布以下代码:template.less,main.less和完整的Grunt文件?我会尽力帮忙。 - raduken
@Raduken 文件本身不是问题,这个错误被触发了,我进行了更正并保存了它,但是Grunt检测到了更改,但实际上没有再次触发任务。 - Matt Cavanagh
但是,以防万一,您能否上传文件?我只是好奇想看看能否解决它 :) - raduken
很不幸,由于代码在三天内发生了很大的变化,我已经没有这些文件了。我知道错误出在哪里,是因为我在上一行中漏掉了一个},导致它无法识别下一行。 - Matt Cavanagh
3个回答

2
这是grunt-contrib-watch包的spawn函数问题,你可能要删除nospawn选项。如果你还没有尝试过,可以尝试使用版本1.0.0的grunt watch。
这个问题之前已经讨论过了。 https://github.com/gruntjs/grunt-contrib-watch/issues/58 此外,请注意文档:
不生成任务运行可能会使监视更容易失败,请根据需要使用。
在你的位置上,我会先升级,确保我拥有最新版本的grunt、grunt watch和grunt less。如果这不能解决问题,我会让它正常生成。

抱歉回复晚了。我尝试了这个方法,现在不会再因为错误而失败了,但是对于grunt watch来说,执行过程需要很长时间,超过30秒。它没有做任何过于复杂的事情,而nospawn则快得多(最多只需一两秒)。 - Matt Cavanagh
虽然生成速度很慢,但这确实解决了问题,我会将其标记为答案。 - Matt Cavanagh

1
我遇到了完全相同的问题(结合grunt-contrib-watchgrunt-contrib-less)。
一个解决方案是设置spawn: true,但构建时间会更长。
我发现在使用最新版本的grunt-contrib-less(自1.0.0以来的所有版本)时会出现此问题。使用grunt-contrib-less 0.12.0后,纠正错误后监视成功继续没有问题。

我也发现了这个问题,构建时间要多花费好几倍的时间。 - Matt Cavanagh

1
您可以像这样简化您的文件:

您可以只需简化文件如下:

//src ===============================
                var src;
                config.src = src = {
                     libFolder       : 'lib/**/*.js',
                     lessFolder      : 'less/**/*.less',

                };

//Watch ===============================
                config.watch = {
                     scripts: {
                        files: ["<%= src.libFolder %>", "<%= src.lessFolder %>"]
                        ,tasks: ["dev", "less:dist"]

                     }
                }

你需要插入要监视的任务和文件:

在上面的例子中,grunt会监视lib和less文件夹中的所有文件,如果我在那里做任何更改,grunt将运行该任务。

同时,您需要在其中插入任务以在停止grunt watch之前运行。

在这种情况下,我同时运行dev和less:dist。

在dev中,我运行:'sprite','imagemin','concat:dev','uglify'

grunt.registerTask('dev',['sprite','imagemin','concat:dev', 'uglify']);

我在grunt watch中添加了此任务,因此grunt将监视所有任务的运行情况,确保无误。
希望这能对您有所帮助。

很遗憾,这只是一个配置样式,它并不能解决我的问题。即使在配置错误之后,Grunt仍然无法执行LESS。 - Matt Cavanagh
所以问题很可能出在 less 任务中?尝试使用 grunt watch 命令运行 grunt -v 和 --force,看看会得到什么信息。 - raduken
尝试过了,不幸的是还是一样的问题。 - Matt Cavanagh

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