web-dev-qa-db-fra.com

Pourquoi Gulp échoue de manière aléatoire avec une erreur ENOENT (ou) ne génère pas de sortie (ou est accidentellement supprimé)?

Environnement logiciel

J'utilise NodeJS v4.2.1 sous Windows.
J'ai inclus mon gulpfile.js, bower.json, et package.json fichiers en bas.


Information additionnelle

  1. Je n'ai pas de IDE en cours d'exécution pour le moment. C'est donc certainement pas un problème avec les fichiers verrouillés par un programme externe.
  2. J'exécute tout sur l'invite de commande.

Question

  1. Quelque chose ne va pas avec mon gulpfile.js?
  2. Est-ce un bug avec NodeJS v4.2.1?
  3. Est-ce un bug avec Gulp?

Problème

Je rencontre ces deux problèmes lorsque j'exécute gulp à l'invite de commande.

Problème n ° 1

Mon dossier build ne serait pas créé une fois sur deux lorsque j'exécute gulp.
Lorsque je l'exécute pour la première fois, il crée le dossier build avec copy-bower Gulp artefacts de sortie de tâche.

Lorsque je l'exécute une autre fois après, le dossier build n'est pas créé.
La sortie de la console Gulp montre clairement mon copy-bower la tâche s'est exécutée après la tâche clean, mais je ne vois pas le dossier build créé.

[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

Problème n ° 2

De temps en temps, je reçois l'une ou l'autre de ces erreurs.

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)

Une autre erreur

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"
  }
}
25
stun

Vos tâches ne renvoient rien et n'appellent aucun rappel, donc Gulp pense que vos tâches sont effectuées immédiatement. En particulier, il n'attendra pas que votre tâche clean ait terminé son travail avant de commencer à copier les fichiers bower. Les deux peuvent se heurter et entraîner des erreurs de système de fichiers.

Changez votre code en ceci:

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 () { });
45
Louis

Si la sortie montre qu'une tâche démarre avant la fin de la précédente (en particulier "nettoyer"), comme ceci (voir 'build' commençant avant la fin de '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

Utilisez ces techniques pour le réparer:

Technique 1 - retourner une promesse

Comme l'a écrit @Louis, tournez ceci:

del = require('del');

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

en cela:

del = require('del');

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

Technique 2 - dépendance de la tâche

tourner ceci:

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

pour ça:

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

Technique 3 - Ordre des tâches

tourner ceci:

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

en cela:

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

Malheureusement, je trouve que ce problème persiste. La solution la plus intéressante (pour moi) est d'utiliser 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
        // ....
    );
});

trouvé: https://davidwalsh.name/gulp-run-sequence

3
Artur Michajluk