Выполнить код после gulp задачи, выполняемой со всеми файлами
Итак, я пробовал Gulp, чтобы посмотреть, как он сравнивается с Grunt по скорости, и я очень впечатлен результатами, но у меня есть одна вещь, которую я не знаю, как это сделать в Gulp.
Итак, у меня есть эта задача Gulp для минимизации HTML:
gulp.task('html-minify', function() {
var files = [
relativePaths.webPath + '/*.html',
relativePaths.webPath + '/components/**/*.html',
relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
];
var changedFiles = buildMetaData.getChangedFiles(files);
//TODO: needs to execute only after successful run of the task
buildMetaData.addBuildMetaDataFiles(changedFiles);
buildMetaData.writeFile();
return gulp.src(changedFiles, {
base: relativePaths.webPath
})
.pipe(filelog())
.pipe(minifyHtml({
empty: true,
quotes: true,
conditionals: true,
comments: true
}))
.pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath + '/' + relativePaths.buildPath));
});
У объекта buildMetaData есть настраиваемые функции, которые мне нужны, и почему я не могу использовать плагины типа gulp -changed. Я пытаюсь выяснить, как (если возможно) запустить блок кода после выполнения minify обрабатывать все файлы и успешно запускать. Возможно ли это с помощью gulp?
Ответы
Ответ 1
Вы можете просто выполнить задачу, которая зависит от html-minify
:
gulp.task('other-task', ['html-minify'], function() {
//stuff
});
Вы также можете прослушать событие stream end
внутри задачи html-minify
:
gulp.task('html-minify', function(done) {
var files = [
relativePaths.webPath + '/*.html',
relativePaths.webPath + '/components/**/*.html',
relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
];
var changedFiles = buildMetaData.getChangedFiles(files);
//TODO: needs to execute only after successful run of the task
buildMetaData.addBuildMetaDataFiles(changedFiles);
buildMetaData.writeFile();
var stream = gulp.src(changedFiles, {
base: relativePaths.webPath
})
.pipe(filelog())
.pipe(minifyHtml({
empty: true,
quotes: true,
conditionals: true,
comments: true
}))
.pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath + '/' + relativePaths.buildPath));
stream.on('end', function() {
//run some code here
done();
});
stream.on('error', function(err) {
done(err);
});
});
Ответ 2
Вы также можете объединить два потока с помощью event-stream. В этом примере вводится ввод из командной строки с yargs, создается конфиг, а затем объединяется два:
var enviroment = argv.env || 'development';
gulp('build', function () {
var config = gulp.src('config/' + enviroment + '.json')
.on('end', function() { gutil.log(warn('Configured ' + enviroment + ' enviroment.')); })
.pipe(ngConstant({name: 'app.config'}));
var scripts = gulp.src('js/*');
return es.merge(config, scripts)
.pipe(concat('app.js'))
.pipe(gulp.dest('app/dist'))
.on('error', function() { });
});
Как и стандарт перед задачами, вы также можете дождаться завершения предыдущей задачи. Это полезно, когда вам нужно передать аргументы перед задачей (которой gulp в настоящее время не поддерживает):
var tasks = {
before: function(arg){
// do stuff
},
build: function() {
tasks.before(arg).on('end', function(){ console.log('do stuff') });
}
};
gulp('build', tasks.build);