J'ai une série de tâches à exécuter à partir d'un observateur, mais je peux les faire tirer dans l'ordre:
Voici les tâches d'abattage et l'observateur.
gulp.task('app_scss', function(){
return gulp.src(appScssDir + '/main.scss')
.pipe(sass({ style: 'compressed' }).on('error', gutil.log))
.pipe(autoprefix('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'Android 4'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_vendor_css', function(){
return gulp.src(appProviderCssDir + '/*.css')
.pipe(minifyCSS({ keepSpecialComments: 0 }))
.pipe(concat('app_vendor.css'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_build_css', function(){
return gulp.src(appBuilderDir + '/*.css')
.pipe(concat('style.css'))
.pipe(gulp.dest(targetCssDir));
});
gulp.task('watch', function () {
gulp.watch(appScssDir + '/**/*.scss', ['app_scss', 'app_build_css']);
});
gulp.task('default', ['app_build_clean', 'app_scss', 'app_vendor_css', 'app_build_css', 'watch']);
Ainsi, lorsque je mets à jour un fichier scss, il convient de les compiler pour créer un seul fichier css. Ensuite, la tâche de construction concats le fichier avec les fichiers du fournisseur. Mais chaque fois que je sauvegarde un fichier, il y a toujours un pas en arrière. Voir la vidéo à titre d'exemple: http://screencast.com/t/065gfTrY
J'ai renommé les tâches, modifié l'ordre dans le rappel de la montre, etc.
Est-ce que je fais une erreur évidente?
Gulp démarre toutes les tâches au "même" moment, à moins que vous ne déclariez des dépendances (ou que vous ne dirigiez des flux l'un vers l'autre).
Ainsi, par exemple, si vous souhaitez que la tâche app_build_css
attende que les tâches app_scss
et app_vendor_css
soient terminées, déclarez les dépendances,
gulp.task('app_scss', function(){
return gulp.src(appScssDir + '/main.scss')
.pipe(sass({ style: 'compressed' }).on('error', gutil.log))
.pipe(autoprefix('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'Android 4'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_vendor_css', function(){
return gulp.src(appProviderCssDir + '/*.css')
.pipe(minifyCSS({ keepSpecialComments: 0 }))
.pipe(concat('app_vendor.css'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_build_css', ['app_scss', 'app_vendor_css'], function(){
return gulp.src(appBuilderDir + '/*.css')
.pipe(concat('style.css'))
.pipe(gulp.dest(targetCssDir));
});
gulp.task('watch', function () {
gulp.watch(appScssDir + '/**/*.scss', ['app_build_css']);
});
gulp.task('default', ['app_build_clean', 'app_build_css', 'watch']);
Vérifiez la docs Gulp.task ()
Avec GULP 3, j'utilise run-sequence package pour aider à exécuter des tâches en séquence et non en parallèle. Voici comment je configure mes tâches watch
, par exemple:
var gulp = require('gulp'),
runSequence = require('run-sequence');
gulp.task('watch', function() {
gulp.watch('templates/**/*.html', function(){ runSequence('templates', 'bundleJS') });
});
L'exemple ci-dessus illustre une tâche watch
typique qui associe la méthode gulp.watch
à des fichiers à écouter lors de la modification et à une fonction de rappel à exécuter lorsque la modification est détectée. La fonction runSequence
est ensuite appelée (dans le rappel d'une certaine watch
) avec une liste de tâches à exécuter de manière synchrone, contrairement à la méthode par défaut qui exécute des tâches en parallèle.
Maintenant que Gulp v4 est sorti depuis presque plus d'un an (publié fin 2017), il offre d'excellents moyens de séquencer des tâches à l'aide de leur bibliothèque appelée bach.
https://github.com/gulpjs/bach
Note : Je recommanderais de passer à Gulp v4 car la v3 comportait des failles de sécurité [je ne sais pas si elles ont été corrigées maintenant].
Gulp v4 introduit gulp.series
et gulp.parallel
. Cela vous permet de créer des tâches et de choisir celles qui sont exécutées en série, en parallèle ou mélangées, comme indiqué ci-dessous.
Explication : Ceci exécutera les tâches scss
et js
dans parallèle, une fois celles-ci terminées, puis exécutera la tâche watch
car elles sont dans série.
const defaultTasks = gulp.series(
gulp.parallel(scss, js),
watch
);
defaultTasks.description = 'Builds scss, and js, then watches them for changes and rebuilds upon change.';
module.exports = {
default: defaultTasks,
scss,
js
}
Voici un exemple dépouillé de ce à quoi mon fichier gulp peut ressembler.
const gulpScss = require('gulp-sass');
const gulpBabel = require('gulp-babel');
const paths = {
scss: [
'public/stylesheets/*.scss'
],
js: [
'public/js/*.js'
]
};
const scss = () => {
return gulp.src(paths.scss)
.pipe(gulpScss)
.pipe(gulp.dest('dist'));
}
scss.description = 'Transpiles scss files to css.';
const js = () => {
return gulp.src(paths.js)
.pipe(gulpBabel({
presets: ['@babel/env']
}))
.pipe(gulp.dest('dist'));
}
js.description = 'Transpiles JS with babel';
const watch = () => {
gulp.watch(paths.scss, scss);
gulp.watch(paths.js, js);
}
watch.description = 'Watches for changes to files and runs their associated builds.';
const defaultTasks = gulp.series(
gulp.parallel(scss, js),
watch
);
defaultTasks.description = 'Builds scss, and js, then watches them for changes and rebuilds upon change.';
module.exports = {
default: defaultTasks,
scss,
js
}