首页 > 解决方案 > 按顺序运行 gulp 任务会引发“管道中未处理的流错误”

问题描述

我有一个吞咽任务如下:

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

每当源文件夹中发生更改时,此任务就会运行,如下所示:

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

所以这个任务按指定的顺序运行 3 个其他 gulp 任务,第一个它运行构建命令,第二个将删除一个文件夹,如下所示:

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));
});

请注意 pathToDestFolder 在delete-sourcecopy-files命令中是同一个文件夹。

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

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'

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

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

所以我猜runSequence没有按预期工作?如果是这样,我该如何解决这个问题?

编辑:

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

编辑2:

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

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

它就像魔术一样起作用。

为什么这反而起作用了?我不知道 !

如果有人可以澄清事情,我会很感激。

标签: node.jsgulp

解决方案


如果你看这里,你会发现del返回一个承诺。这是一个异步方法。

在您的代码中,您在 callcb()之后调用 right 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 你的任务已经完成,它可以继续下一个。


推荐阅读