如何解决Gulp报错‘Task never defined: default’问题?
解决Gulp提示“Task never defined: default”的问题
问题根源
你遇到的报错核心原因很明确:Gulp默认会尝试执行名为default的任务,但你的css-compressor.js只生成了一系列带特定名称的任务(比如compress cache_main.css和compress cache_light.css),并没有定义default这个入口任务,Gulp不知道该从哪个任务开始执行。
另外还有个隐藏坑:你的compress方法看起来没有返回流,这会导致Gulp无法跟踪任务的完成状态,大概率会引发异步执行异常,后面的解决方案也会覆盖这一点。
解决方案1:修改css-compressor.js的makeCache方法
直接在makeCache函数里收集所有生成的任务,然后创建default任务作为入口:
makeCache(sources, dest = './', additionalDirsToWatch=[]) { // 收集所有压缩任务的名称 const taskNames = []; Object.entries(sources).forEach(([cacheFileName, files]) => { const taskName = 'compress ' + cacheFileName; taskNames.push(taskName); gulp.task(taskName, () => { // 务必让compress方法返回流,Gulp才能跟踪任务完成状态 return this.compress(files, cacheFileName, dest); }); }); // 创建default任务,按顺序执行所有压缩任务(用parallel可并行执行) gulp.task('default', gulp.series(taskNames)); }
解决方案2:在主Gulp脚本中手动定义default任务
如果不想修改第三方的css-compressor.js,可以在自己的脚本里手动抓取所有生成的压缩任务,再定义入口:
'use strict'; const path = require('path'), pathToLibs = path.resolve('../../../../libs'); const gulp = require('gulp'); // 手动引入gulp const {CssCompressor} = require('css-compressor.js'), compressor = new CssCompressor(false), resolveLocalSrc = function (files) { return files.map(item => path.resolve(__dirname, item)); }, resolveLibsSrc = function (files) { return files.map(item => path.resolve(pathToLibs, item)); }; let sources = { "cache_main.css": [].concat( resolveLocalSrc([ "scss/design-core.scss" ]), resolveLibsSrc([ "vendor/jquery/dropzone-4.3.0/dropzone.css" ]), resolveLocalSrc([ "../scripts/jquery/whatever.css", "scss/whatever.scss", ]) ), "cache_light.css": resolveLocalSrc(["scss/design-core.scss"]) }; compressor.makeCache(sources, './', ["scss/*.scss"]); // 筛选出所有compress开头的任务,作为default任务的依赖 const compressTasks = Object.keys(gulp.tasks).filter(name => name.startsWith('compress ')); gulp.task('default', gulp.series(compressTasks));
关键注意事项
- 一定要确保
compress方法返回一个流(比如通过return gulp.src(...).pipe(...)的链式调用返回),否则Gulp无法感知任务何时结束,会出现任务“假完成”的异常。 - 如果你用的是Gulp 4.x版本,优先使用
gulp.series(串行执行)或gulp.parallel(并行执行)来组合任务,这是官方推荐的现代写法,比旧版的任务依赖逻辑更可靠。
内容的提问来源于stack exchange,提问作者Michael M
相关产品推荐
相关产品推荐

