Gulp错误:在运行任务时出现ENOENT,lstat错误

5

我正在使用gulp复制和清理我的前端项目。我想运行一些连续的任务。这意味着,例如,我希望开始并完成复制任务,然后运行其以下任务(一个复制任务)。 当我运行我的任务时,经常会看到以下错误:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: ENOENT, lstat '/home/reza/projects/account-web/dist/views'

lstat 后,我会随机看到一个文件名。我发现当没有 dist 文件夹或者 dist 文件夹为空时,复制任务可以正常运行。但是,当 dist 文件夹不为空时,即使执行 clean 任务也会出现错误。以下是我的 gulp 文件和命令结果:

var gulp = require('gulp');
var clean = require('gulp-clean');
var merge = require('gulp-merge');
var runSequence = require('run-sequence');

gulp.task('clean', function () {
    gulp.src('./dist/**').pipe(clean());
});

gulp.task('copy-js', function () {
    return gulp.src('app/js/**').pipe(gulp.dest('dist/js/'));
});
gulp.task('copy-bower', function () {
    return     gulp.src('bower_components/**').pipe(gulp.dest('dist/bower_components/'));
});
gulp.task('copy-script', function () {
    return     gulp.src('app/scripts/**').pipe(gulp.dest('dist/scripts/'));
});
gulp.task('copy-styles', function () {
    var stream1 =     gulp.src('app/styles/**').pipe(gulp.dest('dist/styles/'));
    var stream2 =     gulp.src('app/fonts/**').pipe(gulp.dest('dist/fonts/'));
    var stream3 = gulp.src('app/img/**').pipe(gulp.dest('dist/img/'));
    return merge(stream1, stream2, stream3);
});
gulp.task('copy-views', function () {
    var stream1 =     gulp.src('app/views/**').pipe(gulp.dest('dist/views/'));
    var stream2 = gulp.src('app/*').pipe(gulp.dest('dist/'));
    return merge(stream1, stream2);
});

gulp.task('dist', function () {
    runSequence(['copy-bower','copy-js', 'copy-script', 'copy-styles',     'copy-views']);//
});

gulp.task('dev', function () {
    runSequence('clean', 'dist')
});

gulp.task('default', ['dev']);

我认为这是并发问题,任务并不真正按顺序运行,所以我尝试了一些模块来解决这个问题,比如runSequence

➜  account-web git:(master) ✗ gulp clean
[14:20:55] Using gulpfile ~/projects/account-web/Gulpfile.js
[14:20:55] Starting 'clean'...
[14:20:55] Finished 'clean' after 5.58 ms

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: ENOENT, lstat '/home/reza/projects/account-web/dist/views'


➜  account-web git:(master) ✗ gulp dev
[14:35:03] Using gulpfile ~/projects/account-web/Gulpfile.js
[14:35:03] Starting 'dev'...
[14:35:03] Starting 'clean'...
[14:35:03] Finished 'clean' after 5.47 ms
[14:35:03] Starting 'dist'...
[14:35:03] Starting 'copy-bower'...
[14:35:03] Starting 'copy-js'...
[14:35:03] Starting 'copy-script'...
[14:35:03] Starting 'copy-styles'...
[14:35:03] Starting 'copy-views'...
[14:35:03] Finished 'dist' after 14 ms
[14:35:03] Finished 'dev' after 22 ms

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: ENOENT, open '/home/reza/projects/account-    web/dist/styles/fonts.css'

可能是重复的问题:Gulp错误:events.js:72 - Avalanche
@Avalanche 的问题是“spawn ENOENT”,但我的问题是“错误:ENOENT,打开” - RezKesh
1
嗯...在我看来,你似乎还没有处理一些错误。根据文档,Lstat似乎是一个异步操作,这可能会导致一些麻烦。 - Avalanche
@Avalanche 但你知道为什么会引发lstat错误吗?这是避免错误的一种方式吗?我按照帖子中的错误处理方法做了,但仍然看到相同的错误! - RezKesh
我不记得遇到过这样的问题,但看起来你的gulp配置在编译文件时出现了一些错误;这就是为什么你的dist文件夹要么为空,要么不存在的原因。 - Avalanche
1个回答

7

我想知道是否尝试在已删除嵌套文件夹后异步删除嵌套文件夹中的文件。尝试更改您的src以包括dist文件夹而不是通配符。这将告诉它删除整个dist文件夹,而不是独立删除每个项目。

gulp.task('clean', function () {
    gulp.src('./dist').pipe(clean());
});

看起来 gulp-clean 已被弃用,你可能想要尝试使用 del 来替换它。它可以正确处理你原本的 glob 模式。


在这里写了一篇关于这个问题的小文章链接 - John Miller
1
清理任务应该返回流或者可以与其他任务并行运行。 - Dinoboff
1
如果你使用 'del' 而不是 'clean',请使用 'del.sync'。'del' 返回一个 promise,因此它以异步方式运行,这就是为什么 OP 在另一个任务正在运行时出现文件被删除(清理)的问题。 - nmgeek

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