【问题标题】:Why is Gulp failing randomly with ENOENT error (or) failing to generate output (or accidentally deleted)?为什么 Gulp 随机失败并出现 ENOENT 错误(或)无法生成输出(或意外删除)?
【发布时间】:2016-01-22 11:24:50
【问题描述】:

软件环境

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


附加信息

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

问题

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

问题

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

问题 #1

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

当我再次运行它时,build 文件夹不会被创建。
gulp 控制台输出清楚地显示了我的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

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

【问题讨论】:

  • 这是在我可以克隆的仓库中吗?
  • @James Louis 下面的回答是正确的。我没有return"clean" 任务,它导致其他任务由于写入和删除期间的文件锁定而随机失败。我没有这方面的回购,因为我只玩 Gulp 和 Bower。我拥有的所有文件都是上面的gulpfile.jspackage.jsonbower.json

标签: node.js gulp


【解决方案1】:

您的任务不会返回任何内容或调用任何回调,因此 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-sequence 可能有助于同步 gulp 任务! npmjs.com/package/run-sequence
【解决方案2】:

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

[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'
});

【讨论】:

    【解决方案3】:

    遗憾的是,我发现这个问题仍然存在。最简单的解决方案(对我来说)是使用运行序列:

    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

    【讨论】:

      【解决方案4】:

      以防万一有人在遵循此线程中的解决方案后遇到此问题...我在 gulp.parallel 而不是 gulp.series 中执行我的 cleancopy 任务,这使我的构建任务失败随机。我花了 1 个小时试图找出问题所在,但从未注意到那个小细节。希望这对某人有用

      【讨论】:

        猜你喜欢
        • 2015-12-30
        • 1970-01-01
        • 2019-01-02
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多