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

时间:2015-10-23 01:50:32

标签: node.js gulp

软件环境

我在Windows上使用 NodeJS v4.2.1 我在底部添加了gulpfile.jsbower.jsonpackage.json个文件。

其他信息

  1. 我目前没有运行任何IDE。所以文件被外部程序锁定肯定是
  2. 我在命令提示符下运行所有​​内容。
  3. 问题

    1. 我的gulpfile.js
    2. 出了什么问题
    3. 这是NodeJS v4.2.1的错误吗?
    4. 这是Gulp的错误吗?
    5. 问题

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

      问题#1

      我运行build时,不会每隔一段时间创建一个gulp文件夹 当我第一次运行它时,它会创建build文件夹,其中包含copy-bower Gulp任务输出工件。

      当我再次运行它时,build文件夹无法创建 gulp控制台输出清楚地显示我的copy-bower任务在<{strong> 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
      

      问题#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"
        }
      }
      

4 个答案:

答案 0 :(得分:45)

您的任务不会返回任何内容或致电任何回调,因此Gulp认为您的任务是立即完成的。特别是,在开始复制bower文件之前,它不会等待你的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 () { });

答案 1 :(得分: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

使用这些技巧来修复它:

技术1 - 返回承诺

正如@Louis所写,转过来:

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 - 任务排序

转过来:

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

进入这个:

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

答案 2 :(得分:3)

可悲的是,我发现这个问题仍然存在。最有效的解决方案(对我而言)是使用run-sequence:

var runSequence = require('run-sequence');

gulp.task('some-task', function() {
    runSequence(
        ['task-1', 'task-2', 'task-3'], // These 3 can be done in parallel
        'task-4', // ...then just do this
        ['task-5', 'task-5'], // ...then do these things in parallel
        'task-6', // ...then do this
        // ....
    );
});

发现:https://davidwalsh.name/gulp-run-sequence

答案 3 :(得分:0)

以防万一有人遵循该线程中的解决方案后遇到此问题...我正在clean而不是{{1}中执行copygulp.parallel任务使我的构建任务随机失败。我花了1个小时试图弄清楚问题出在哪里,但从未注意到这么小的细节。希望这对某人有用