Почему Gulp ошибочно работает с ошибкой ENOENT (или), неспособной генерировать вывод (или случайно удаленный)?

20

Программная среда

Я использую NodeJS v4.2.1 в Windows.
Я включил файлы gulpfile.js , bower.json и package.json внизу.

Дополнительная информация

  1. На данный момент у меня нет IDE. Таким образом, определенно не проблема с файлами, заблокированными внешней программой.
  2. Я запускаю все в командной строке.

Вопрос

  1. Что-то не так с моим gulpfile.js ?
  2. Это ошибка с NodeJS v4.2.1 ?
  3. Это ошибка с Gulp?

Проблема

У меня возникают эти две проблемы, когда я запускаю gulp в командной строке.

Проблема №1

Моя папка build не будет создаваться каждый раз, когда я запускаю gulp .
Когда я запускаю его в первый раз, он создает папку build с артефактами выхода copy-bower Gulp.

Когда я запустил его еще раз после него, папка 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"
  }
}
    
задан o-relogio-gulp-encerra 23.10.2015 в 03:50
источник
  • Является ли это в репо где-то, что я могу клонировать? –  James 23.10.2015 в 04:03
  • @ Ответ Джеймс Луи ниже. Я не возвращал «чистую» задачу, и это приводило к тому, что другие задачи прерывались случайным образом из-за блокировки файлов во время записи и удаления. У меня нет репо для этого, поскольку я играю только с Gulp and Bower. Все файлы, которые у меня есть, - gulpfile.js, package.json и bower.json сверху. –  stun 23.10.2015 в 17:23

3 ответа

41

Ваши задачи не возвращают ничего или не вызывают никаких обратных вызовов, поэтому 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 () { });
    
ответ дан Louis 23.10.2015 в 12:55
  • Спасибо! Я сходил с ума от этой случайной ошибки файла :) –  monzonj 10.12.2015 в 18:40
  • Большое спасибо, это также стало основной причиной проблем, которые у меня были. Я добавлю, что последовательность выполнения может оказаться полезной для синхронизации задач gulp, когда некоторые задачи зависят от результата других! npmjs.com/package/run-sequence –  Form 07.04.2016 в 19:18
8

Если на выходе показано, что одна задача запускается до того, как предыдущий закончен (особенно «чистый»), как это (см. «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'
});
    
ответ дан A-S 26.03.2017 в 07:46
1

К сожалению, я нахожу, что этот вопрос все еще происходит. Решение esiest (для меня) - использовать 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
        // ....
    );
});

найдено: Ссылка

    
ответ дан Artur Michajluk 25.01.2018 в 08:38