为什么Gulp随机失败ENOENT错误(或)无法生成输出(或意外删除)?

软件环境

我在Windows上使用NodeJS v4.2.1
我在底部包含了我的gulpfile.jsbower.jsonpackage.json文件。


附加信息

  1. 我目前没有任何IDE运行。 所以这绝对不是一个外部程序locking文件的问题。
  2. 我正在命令提示符下运行所有​​内容。

  1. 我的gulpfile.js吗?
  2. 这是NodeJS v4.2.1吗?
  3. 这是一个与Gulp的错误?

问题

当我在命令提示符下运行gulp时遇到了这两个问题。

问题#1

当我运行gulp时,我的生成文件夹不会被创build。
当我第一次运行它时,它会创build具有copy-bower Gulp任务输出构件的build文件夹。

当我在它之后再次运行它时,生成文件夹不会被创build。
吞吐控制台的输出清楚地显示了我的copy-bower任务 clean任务运行,但是我没有看到创build的build文件夹。

 [21:21:32] Using gulpfile [21:21:32] Starting 'clean'... [21:21:32] Finished 'clean' after 3.66 [21:21:32] Starting 'copy-bower'... [21:21:32] Finished 'copy-bower' after [21:21:32] Starting 'default'... [21:21:32] Finished 'default' after 6. Directory: C:\Users\stun\Desktop\test-app Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 10/22/2015 9:00 PM bower_components d----- 10/22/2015 8:59 PM node_modules -a---- 10/22/2015 9:30 PM 347 bower.json -a---- 10/22/2015 9:31 PM 421 gulpfile.js -a---- 10/22/2015 9:30 PM 301 package.json 

问题#2

不时,我得到这些错误中的任何一个。

 events.js:141 throw er; // Unhandled 'error' event ^ Error: ENOENT: no such file or directory, chmod 'C:\Users\stun\Desktop\test-app\build\bower_components\jquery\dist\jquery.min.map' at Error (native) 

另一个错误

 events.js:141 throw er; // Unhandled 'error' event ^ Error: ENOENT: no such file or directory, stat 'C:\Users\stun\Desktop\test-app\build\bower_components\bootstrap\dist\fonts' at Error (native) 

gulpfile.js

 var gulp = require('gulp'), del = require('del'); gulp.task('clean', function () { del(['build']); }); gulp.task('copy-bower', ['clean'], function () { var src = [ './bower_components/bootstrap/dist/**', './bower_components/jquery/dist/*' ]; gulp.src(src, { base: '.' }) .pipe(gulp.dest('./build/')); }); gulp.task('default', ['copy-bower'], function () { }); 

bower.json

 { "name": "test-app", "description": "testing gulp and bower", "main": "", "moduleType": [], "authors": [""], "license": "MIT", "homepage": "", "private": true, "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests" ], "dependencies": { "bootstrap": "~3.3.5" } } 

的package.json

 { "name": "test-app", "version": "1.0.0", "description": "testing gulp and bower", "main": "", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "del": "^2.0.2", "gulp": "^3.9.0" } } 

你的任务不会返回任何东西或者调用任何callback,所以Gulp认为你的任务是立即完成的。 特别是,在开始复制文件之前,它不会等待clean任务完成其工作。 这两者可能会冲突并导致文件系统错误。

将您的代码更改为:

 var gulp = require('gulp'), del = require('del'); gulp.task('clean', function () { // Return the promise that del produces. return del(['build']); }); gulp.task('copy-bower', ['clean'], function () { var src = [ './bower_components/bootstrap/dist/**', './bower_components/jquery/dist/*' ]; // Return your stream. return gulp.src(src, { base: '.' }) .pipe(gulp.dest('./build/')); }); gulp.task('default', ['copy-bower'], function () { }); 

如果输出显示一个任务在前一个任务完成之前就已经开始(尤其是“clean”),就像这样(参见'clean'之前的'build'结束):

 [08:32:07] Using gulpfile ~/project/gulpfile.js [08:32:07] Starting 'clean'... [08:32:07] Starting 'build'... [08:32:07] Finished 'clean' after 14 ms [08:32:07] Finished 'build' after 15.53 ms 

使用这些技术来解决它:

技术1 – 返回一个承诺

正如@路易斯写的,把这个:

 del = require('del'); gulp.task('clean', function () { del(['build']); }); 

进入这个:

 del = require('del'); gulp.task('clean', function () { return del(['build']); // see "return" }); 

技术2 – 任务的依赖性

打开这个:

 gulp.task('build', function () { // some code... }); 

对此:

 gulp.task('build', ['clean'], function () { // see 'clean' as dependency // some code... }); 

技术3 – 任务sorting

打开这个:

 gulp.task('default', ['build', 'serve', 'watch']); 

进入这个:

 gulp.task('default', ['build'], function () { gulp.start(['serve', 'watch']); // starts only after 'build' });