我有一个吞吞吐吐的任务,如下所示:
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));
});
请注意,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
在cmd提示符下运行(将清除pathToDestFolder),然后gulp copy-files
(将源文件夹复制到两个文件夹pathToDestFolder和anotherPath中)运行时,它将按预期工作。
所以我想runSequence
没有按预期工作?如果是这样,我该如何解决?
我尝试使用rimraf
代替del
,并且一切似乎都可以正常工作,我知道这rimraf
已经被描述了,最好使用del
代替,但是为什么del
在这种情况下会导致异常?
rimraf
我没有使用它作为解决方案,而是尝试了以下解决方案:
gulp.task('delete-dest', (cb) => {
del([pathToDestFolder], {force: true})
.then(paths => {cb();});
});
它像魔术一样工作。
为什么这样做有效呢?我不知道 !
如果有人可以澄清事情,我将不胜感激。
如果您在这里查看,则会发现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您的任务已完成,并且可以继续进行下一个任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句