J'utilise NodeJS v4.2.1 sous Windows.
J'ai inclus mon gulpfile.js
, bower.json
, et package.json
fichiers en bas.
gulpfile.js
?NodeJS v4.2.1
?Je rencontre ces deux problèmes lorsque j'exécute gulp
à l'invite de commande.
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
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)
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 () { });
{
"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"
}
}
{
"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"
}
}
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 () { });
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:
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"
});
tourner ceci:
gulp.task('build', function () {
// some code...
});
pour ça:
gulp.task('build', ['clean'], function () { // see 'clean' as dependency
// some code...
});
tourner ceci:
gulp.task('default', ['build', 'serve', 'watch']);
en cela:
gulp.task('default', ['build'], function () {
gulp.start(['serve', 'watch']); // starts only after 'build'
});
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
// ....
);
});