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

stu*_*tun 25 node.js gulp

软件环境

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


附加信息

  1. 我目前没有运行任何IDE.因此,外部程序锁定文件绝对不是问题.
  2. 我在命令提示符下运行所有​​内容.

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

问题

gulp在命令提示符下运行时遇到这两个问题.

问题#1

build跑的时候不会每隔一段时间创建我的文件夹gulp.
当我第一次运行它时,它会创建build具有copy-bowerGulp任务输出工件的文件夹.

当我再次运行它时,build文件夹不会被创建.
吞气控制台输出清楚地表明我的copy-bower任务运行clean任务,但我没有看到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
Run Code Online (Sandbox Code Playgroud)

问题#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)
Run Code Online (Sandbox Code Playgroud)

另一个错误

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)
Run Code Online (Sandbox Code Playgroud)

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 () { });
Run Code Online (Sandbox Code Playgroud)

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

的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"
  }
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 45

您的任务不会返回任何内容或调用任何回调,因此Gulp认为您的任务是立即完成的.特别是,clean在开始复制bower文件之前,它不会等待您的任务完成其工作.这两者可能会发生冲突并导致文件系统错误.

将您的代码更改为:

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 () { });
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这也是我遇到问题的根本原因.我将补充说,当一些任务依赖于其他任务的输出时,`run-sequence`可能有助于同步gulp任务!https://www.npmjs.com/package/run-sequence (2认同)

A-S*_*A-S 9

如果输出显示一个任务在前一个任务完成之前就开始了(特别是"干净"),就像这样(参见'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
Run Code Online (Sandbox Code Playgroud)

使用这些技术来修复它:

技术1 - 回报承诺

正如@Louis所写,转过来:

del = require('del');

gulp.task('clean', function () {
    del(['build']);
});
Run Code Online (Sandbox Code Playgroud)

进入这个:

del = require('del');

gulp.task('clean', function () {
    return del(['build']);  // see "return"
});
Run Code Online (Sandbox Code Playgroud)

技术2 - 任务的依赖性

转过来:

gulp.task('build', function () {
  // some code...
});
Run Code Online (Sandbox Code Playgroud)

对此:

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

技术3 - 任务排序

转过来:

gulp.task('default', ['build', 'serve', 'watch']);
Run Code Online (Sandbox Code Playgroud)

进入这个:

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