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 任务,第一个它运行构建命令,第二个将删除一个文件夹,如下所示:
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-source
和copy-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-dest
in 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();});
});
它就像魔术一样起作用。
为什么这反而起作用了?我不知道 !
如果有人可以澄清事情,我会很感激。
解决方案
如果你看这里,你会发现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 你的任务已经完成,它可以继续下一个。
推荐阅读
- python - Python / Selenium - “chromedriver”可执行文件需要在 PATH 中
- angular - Angular:数据绑定到其中一种数据类型中存在的属性
- java - MobileAds.getRequestConfiguration 未解析的引用
- javascript - 如何获取网页缓存资源的内容
- typescript - 打字稿错误:找不到模块“反应”
- angular - 如何使用 oboe.js 在 post 请求中发送表单数据?
- azure - 使用 @azure/identity 访问 Key Vault 并收到错误“请求缺少承载或 PoP 令牌错误 401”
- python - 在python中使用最小二乘最大化和最小化函数
- vue.js - 如何使 ScrollView 子项适应 Nativescript-Vue 中 ScrollView 的大小?
- android - 如何备份解密的勒索软件 android studio 项目而不被再次感染?