对于那些从 gulp v3 迁移到 v4 或正在使用gulp.task() 在 gulp v4 中定义任务并收到此错误消息:Task never defined,问题通常出在此处:
转发参考
前向引用是当你编写任务时,使用字符串
参考资料,尚未注册。这是一个常见的
在旧版本中练习,但删除此功能以实现
更快的任务运行时间并促进命名函数的使用。在较新的
版本,你会得到一个错误,消息“任务从未定义”,
如果您尝试使用前向引用。你可能会遇到这种情况
尝试将导出用于您的任务注册和编写任务
通过字符串。在这种情况下,请使用命名函数而不是字符串
参考文献。
在迁移过程中,您可能需要使用前向引用注册表。
这将为每个任务引用添加一个额外的闭包,并且
大大减慢您的构建速度。不要太依赖这个修复
长。
来自gulpjs documentation re: gulp.series 和gulp.parallel documentation。
这是什么意思。创建任务有两种方式:
1. gulp.task('someStringAsTask', function() {..})
2. function myNamedFunction () {…}
当您使用版本 1 (gulp.task…) 时,您无法通过其字符串名称引用该任务,直到它被注册。所以你不能这样做:
exports.sync = gulp.series('sass2css', serve, watch);
// or gulp.task('dev', gulp.series('sass2css', serve, watch); doesn't work either
gulp.task('sass2css', function() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
})
结果
AssertionError [ERR_ASSERTION]: Task never defined: sass2css
这是一个前向引用,组成一个任务(使用gulp.series 或gulp.parallel)并通过它的字符串名称(在上面的例子中为'sass2css')引用一个任务之前已注册。 (调用“gulp.task(…..)”是注册的行为)先把gulp.task('sass2css',...) 解决问题。
如果你使用定义任务的版本二:
function sass2css() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
}
您现在正在使用 命名函数 来注册任务,并且不需要将其名称用作字符串。所以现在可以了:
exports.sync = gulp.series(sass2css, serve, watch);
// gulp.task('dev', gulp.series(sass2css, serve, watch); this also works
后跟(或之前 - 两者都有效):
function sass2css() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
}
原来的 OP 使用了这个并且成功了:
import gulp from 'gulp';
gulp.task('dev', gulp.series('clean');
注意到clean.js 在dev.js 之前被导入,所以没关系。
这不起作用:
import gulp from 'gulp';
gulp.task('build', gulp.series('clean');
因为字符串引用的任务,'clean' 在引用它的build.js 之后被导入(并因此注册) - 因此创建了对字符串引用任务的非法前向引用。
因此有两种标准方法可以修复此错误:
使用命名函数来定义不是gulp.task('someTask',...) 的任务。那么在编写其他任务时使用这些命名函数的顺序并不重要,即使用gulp.series 或gulp.parallel 时。而且使用命名函数还有其他好处,比如传递参数,所以这是最好的选择。
如果您确实使用较旧的 gulp v3 gulp.task 方法通过字符串引用创建任务,请注意在实际创建任务之后之前不要引用这些任务。 p>
另请参阅我在 task never defined error 的回答,以解决导致相同错误消息的另一个问题。 特别是在 gulp4 文件中使用 gulp.task('someTask', ['anotherTask'], function(){}) synatx。