按顺序运行gulp任务会在管道中抛出“未处理的流错误”

问题描述 投票:6回答:1

我有一个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'

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

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

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

Edit:

我试图使用rimraf而不是del,所有似乎工作得很好,我知道rimraf被贬值,而且最好使用del代替,但为什么del在这种情况下导致异常?

Edit 2:

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

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

它像魔术一样运作。

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

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

node.js gulp
1个回答
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的一个功能,尽管可能不是,而不是在你的任务中调用回调,你可以像这样返回一个承诺:

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

这将告诉Gulp你的任务已经完成,它可以继续下一步。

© www.soinside.com 2019 - 2024. All rights reserved.