【问题标题】:Gulp4. "AssertionError : Task never defined" when calling or importing tasks吞咽4。调用或导入任务时出现“AssertionError : Task never defined”
【发布时间】:2019-03-07 06:43:06
【问题描述】:

您可以在下面看到问题的简化视图。基本上,我可以在任务 task2,3.js 中使用 gulp.series 调用 task1.js,但是一旦我添加了相同的代码来调用 task1。 task4.js 中的 js - 抛出 Task never defined: task1 错误。 任务文件夹中的任务比下面的文件结构示例中的任务多。

我有三个任务,

...
/tasks
   build.js
   clean.js
   dev.js
gulpfile.babel.js
...

gulpfile.babel.js 中所有这些都需要使用 require-dir 包

import requireDir from 'require-dir';
requireDir('./tasks', {recurse: true});

这让我可以在 dev.js 上从 clean.js 调用任务,并且工作正常。

import gulp from 'gulp';
gulp.task('dev', gulp.series('clean');

但是在我在 build.js 中添加相同的代码结构之后。

import gulp from 'gulp';
gulp.task('build', gulp.series('clean');

它以某种方式破坏了 gulp 流(我猜),所以现在在任何任务调用中我得到:
$gulp 开发
-AssertionError [ERR_ASSERTION]:任务从未定义:干净


$gulp -v

[11:50:11] CLI version 2.0.1
[11:50:11] Local version 4.0.0

【问题讨论】:

    标签: gulp


    【解决方案1】:

    对于那些从 gulp v3 迁移到 v4 或正在使用gulp.task() 在 gulp v4 中定义任务并收到此错误消息:Task never defined,问题通常出在此处:

    转发参考

    前向引用是当你编写任务时,使用字符串 参考资料,尚未注册。这是一个常见的 在旧版本中练习,但删除此功能以实现 更快的任务运行时间并促进命名函数的使用。在较新的 版本,你会得到一个错误,消息“任务从未定义”, 如果您尝试使用前向引用。你可能会遇到这种情况 尝试将导出用于您的任务注册和编写任务 通过字符串。在这种情况下,请使用命名函数而不是字符串 参考文献。

    在迁移过程中,您可能需要使用前向引用注册表。 这将为每个任务引用添加一个额外的闭包,并且 大大减慢您的构建速度。不要太依赖这个修复 长。

    来自gulpjs documentation re: gulp.seriesgulp.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.seriesgulp.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.jsdev.js 之前被导入,所以没关系。

    这不起作用:

    import gulp from 'gulp';
    gulp.task('build', gulp.series('clean');
    

    因为字符串引用的任务,'clean' 在引用它的build.js 之后被导入(并因此注册) - 因此创建了对字符串引用任务的非法前向引用

    因此有两种标准方法可以修复此错误:

    1. 使用命名函数来定义不是gulp.task('someTask',...) 的任务。那么在编写其他任务时使用这些命名函数的顺序并不重要,即使用gulp.seriesgulp.parallel 时。而且使用命名函数还有其他好处,比如传递参数,所以这是最好的选择。

    2. 如果您确实使用较旧的 gulp v3 gulp.task 方法通过字符串引用创建任务,请注意在实际创建任务之后之前不要引用这些任务。 p>

    另请参阅我在 task never defined error 的回答,以解决导致相同错误消息的另一个问题。 特别是在 gulp4 文件中使用 gulp.task('someTask', ['anotherTask'], function(){}) synatx。

    【讨论】:

    • 惊人的惊人答案。鞠躬致意!非常感谢。
    【解决方案2】:

    gulp 4 的 seriesparallel 函数不会像 README 所暗示的那样创建任务定义,而是它们都运行参数中的任务。为了按预期工作,需要用闭包包围调用。

    所以,修复摘录

    gulp.task('build', gulp.series('clean'));
    

    需要添加闭包:

    // Older EcmaScripts:
    gulp.task('build', function() { return gulp.series('clean') });
    
    // EcmaScript 6:
    gulp.task('build', () => gulp.series('clean'));
    

    【讨论】:

      【解决方案3】:

      我有一个类似的设置,我递归地require'd 目录下的所有任务。在更新到 gulp 4 后开始出现错误 Task never defined

      我尝试了 Pedro 解决方案,但这导致了另一个错误:

      The following tasks did not complete: default
      Did you forget to signal async completion?
      

      解决方案对我来说相当简单,只需导入缺少的任务即可。

      import gulp from 'gulp';
      import './clean';
      
      gulp.task('build', gulp.series('clean'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-05
        • 2017-01-26
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 2016-01-21
        • 2014-07-03
        相关资源
        最近更新 更多