按顺序运行gulp任务时出现`管道中未处理的流错误`。

6

以下是我的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));
});

请注意,在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两个文件夹中),它按预期工作。

所以我猜测runSequence并没有像预期的那样工作?如果是这样,我该如何解决?

编辑:

我试图使用rimraf来代替del,似乎一切都正常工作了。我知道rimraf已经过时,最好使用del代替,但为什么在这种情况下del会导致异常呢?

编辑2:

我尝试了另一种解决方法:

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

它就像魔法一样奏效。

为什么这个工作了?我不知道!

如果有人能澄清事情,我将不胜感激。

1个回答

6
如果你在这里查看,你会发现del返回一个promise。它是一个异步方法。
在你的代码中,在调用del(...)之后立即调用cb(),但是在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的功能(可能不是),而不是在任务中调用回调,您可以像这样返回一个承诺:

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

那样告诉Gulp你的任务已经完成,它可以继续执行下一个任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接