依次运行gulp任务会在管道中引发“未处理的流错误”

时间:2019-03-13 10:10:49

标签: node.js gulp

我有如下任务:

gulp.task('build-files, function(cb) {
    runSequence('run-build-cmd',
        'delete-dest', 'copy-files',
        cb);
});

只要源文件夹中发生以下更改,此任务就会运行:

gulp.watch(pathToSrcFolder, ['build-files']);

因此,此任务以指定顺序运行其他3个gulp任务,第一个任务运行build命令,第二个任务将删除文件夹,如下所示:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true});
    cb();
});

,第三个文件会将文件从一个源复制到两个目标:

gulp.task('copy-files', () => {
    return gulp.src(pathToSrcFolder)
        .pipe(gulp.dest(pathToDestFolder))
        .pipe(gulp.dest(anotherPath));
});

请注意,在delete-sourcecopy-files命令中,pathToDestFolder是相同的文件夹。

我运行此序列的问题是此错误:

internal/streams/legacy.js:59
      throw er; // Unhandled stream error in pipe.
      ^

Error: ENOENT: no such file or directory, chmod 'pathToDestFolder\path\to\some\file\file.ext'

我不知道为什么会收到此错误。

当我在cmd提示符下运行gulp delete-dest(将清除pathToDestFolder),然后运行gulp copy-files(将源文件夹复制到两个文件夹pathToDestFolder和anotherPath)时,它按预期工作。 / p>

所以我猜runSequence不能按预期工作?如果是这样,我该如何解决?

编辑:

我尝试使用rimraf代替del,并且一切似乎都正常,我知道rimraf被贬低了,最好使用del代替,但是为什么del在这种情况下会导致异常?

编辑2:

我没有使用rimraf作为解决方案,而是尝试了以下解决方案:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true})
    .then(paths => {cb();});
});

它像魔术一样工作。

为什么这样做有效?我不知道 !

如果有人可以澄清一些事情,我将非常感激。

1 个答案:

答案 0 :(得分:6)

如果您查看here,则会发现del返回了诺言。这是一个异步方法。

在您的代码中,您在调用cb()之后立即调用del(...)但实际上在del完成删除目录之前。

这就是为什么在与then链接之后必须执行回调:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true})
    .then(paths => {cb();});
});

然后您的操作将以正确的顺序运行。

您之前遇到的错误是由于事物以怪异的顺序运行而导致的,导致行为怪异。 Gulp试图在文件系统删除目录时将其复制到目录中,并且该冲突会导致文件系统错误。


作为实验,您可以尝试运行del的同步版本,如下所示:

gulp.task('delete-dest', (cb) => {
    del.sync([pathToDestFolder], {force: true});
    cb();
});

查看是否可行(尽管您应该首选异步版本)。


作为旁注,除非这可能是Gulp 4的一项功能(尽管可能并非如此),否则您无需像在任务中调用回调那样,就可以返回一个Promise,如下所示:

gulp.task('delete-dest', () => {
    return del([pathToDestFolder], {force: true});
});

这将告诉Gulp您的任务已完成,并且可以继续进行下一个任务。