Gulpjs объединяет две задачи в одну задачу
В настоящее время у меня есть две задачи, которые компилируют sass файлы. Я бы по-прежнему хотел бы объединить два каталога в отдельные файлы, но кажется, что он был бы более ремонтопригодным, если бы я мог просто создать задачу "sass", которая будет отвечать за всю компиляцию sass.
// Compile Our Sass
gulp.task('bootstrap-sass', function() {
return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(contact('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
});
gulp.task('site-sass', function() {
return gulp.src('./public/app/scss/*.scss')
.pipe(sass())
.pipe(contact('site.css'))
.pipe(gulp.dest('./public/dist/css'));
});
UPDATE:
Я пробовал это:
// Compile Our Sass
gulp.task('sass', function() {
var bootstrap = function() {
return gulp
.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(concat('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
};
var site = function() {
return gulp
.src('./public/src/scss/*.scss')
.pipe(sass())
.pipe(concat('site.css'))
.pipe(gulp.dest('./public/dist/css'));
};
return Promise.all([bootstrap, site]);
});
Но теперь кажется, что ни один файл не компилируется. Любые предложения о том, что я делаю неправильно?
Ответы
Ответ 1
Я думаю, что правильный способ сделать это - использовать зависимость задачи.
В gulp вы можете определить задачи, которые должны выполняться перед заданием.
Например:
gulp.task('scripts', ['clean'], function () {
// gulp.src( ...
});
При выполнении gulp scripts
в терминале очистка выполняется перед задачей скриптов.
В вашем примере у меня были бы две отдельные задачи SASS как зависимость от общей задачи SASS. Что-то вроде:
// Compile Our Sass
gulp.task('bootstrap-sass', function() {
return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(contact('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
});
gulp.task('site-sass', function() {
return gulp.src('./public/app/scss/*.scss')
.pipe(sass())
.pipe(contact('site.css'))
.pipe(gulp.dest('./public/dist/css'));
});
gulp.task('sass', ['bootstrap-sass', 'site-sass']);
Подробнее о задаче dependecy вы читаете в разделе рецептов gulp: https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md
Ответ 2
Он работает.
var task1 = gulp.src(...)...
var task2 = gulp.src(...)...
return [task1, task2];
Ответ 3
Решение 1:
gulp.task('sass', function() {
gulp.start('bootstrap-sass', 'site-sass');
})
gulp.start выполняет задачи параллельно. И это асинхронный, что означает, что "bootstrap-sass" может быть закончен до "site-sass". Но это не рекомендуется, потому что
gulp.start специально не задокументирован, потому что это может привести к сложным файлам сборки, и мы не хотим, чтобы люди его использовали
см. https://github.com/gulpjs/gulp/issues/426
Решение 2:
var runSequence = require('run-sequence');
gulp.task('sass', function (cb) {
runSequence(['bootstrap-sass', 'site-sass'], cb);
});
run-sequence - это плагин gulp.
Запускает последовательность задач gulp в указанном порядке. Эта функция предназначена для разрешения ситуации, когда вы определили порядок выполнения, но решили не использовать или не использовать зависимости.
runSequence(['bootstrap-sass', 'site-sass'], cb);
Эта строка запускает 'boostrap-sass' и 'site-sass' параллельно. Если вы хотите запускать задачи последовательно, вы можете
runSequence('bootstrap-sass', 'site-sass', cb);
Ответ 4
Я только что нашел плагин gulp под названием gulp-all
и попробовал его. Это просто в использовании.
https://www.npmjs.com/package/gulp-all
В документации пакета сказано:
var all = require('gulp-all')
var styl_dir = 'path/to/styles/dir'
var js_dir = 'path/to/scripts/dir'
function build() {
return all(
gulp.src(styl_dir + '/**/*')
// build Styles
.pipe(gulp.dest('dist_dir')),
gulp.src(js_dir + '/**/*')
// build Scripts
.pipe(gulp.dest('dist_dir'))
)
}
gulp.task('build', build);
также вы можете поместить подзадачи в массив:
var scriptBundles = [/*...*/]
function build(){
var subtasks = scriptBundles.map(function(bundle){
return gulp.src(bundle.src).pipe(/* concat to bundle.target */)
})
return all(subtasks)
}
Ответ 5
С Gulp4 вы можете использовать:
-
gulp.series
для последовательного исполнения -
gulp.parallel
для параллельного выполнения
gulp.task('default', gulp.series('MyTask001', 'MyTask002'));
gulp.task('default', gulp.parallel('MyTask001', 'MyTask002'));
Статья о здесь
Вам больше не нужен плагин последовательности запуска
Вам нужно установить: npm install -D gulp @next
Ответ 6
Оказывается, что функция site()
возвращала ошибку. Чтобы исправить это, мне нужно было убедиться, что bootstrap()
побежал первым, поэтому я закончил с этим:
// Compile Our Sass
gulp.task('sass', function() {
var bootstrap = function() {
return gulp
.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(concat('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
};
var site = function() {
return gulp
.src('./public/src/scss/*.scss')
.pipe(sass())
.pipe(concat('site.css'))
.pipe(gulp.dest('./public/dist/css'));
};
return bootstrap().on('end', site);
});
Ответ 7
В gulp4 (все еще в альфе), у нас есть параллель, поэтому вы можете сделать:
// Compile Our Sass
gulp.task('bootstrap-sass', function() {
return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(contact('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
});
gulp.task('site-sass', function() {
return gulp.src('./public/app/scss/*.scss')
.pipe(sass())
.pipe(contact('site.css'))
.pipe(gulp.dest('./public/dist/css'));
});
gulp.task('sass', gulp.parallel('bootstrap-sass', 'site-sass')); // Combine
Вы также можете записать его как одну задачу:
gulp.task('sass', gulp.parallel(
function() {
return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(contact('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
},
function() {
return gulp.src('./public/app/scss/*.scss')
.pipe(sass())
.pipe(contact('site.css'))
.pipe(gulp.dest('./public/dist/css'));
}));
Я предпочитаю первый метод, потому что его легче поддерживать
Ответ 8
Вы пытались использовать merge-stream?
merge = require('merge-stream');
// Compile Our Sass
gulp.task('sass', function() {
var bootstrap = gulp
.src('./public/bower/bootstrap-sass/lib/*.scss')
.pipe(sass())
.pipe(concat('bootstrap.css'))
.pipe(gulp.dest('./public/dist/css'));
var site = gulp
.src('./public/src/scss/*.scss')
.pipe(sass())
.pipe(concat('site.css'))
.pipe(gulp.dest('./public/dist/css'));
return merge(bootstrap, site);
});
Подробнее см. https://blog.mariusschulz.com/2015/05/02/merging-two-gulp-streams
Ответ 9
РЕШЕНИЕ: вызовите функции!!!
return Promise.all([bootstrap(), site()])
Помните о parens bootstrap(), сайте(), чтобы они вернули обещание:)
Ответ 10
Также возможно создать другую задачу для компиляции других задач, передав массив имен задач следующим образом:
gulp.task('sass-file-one', function () {
console.log('compiled sass-file-one')
});
gulp.task('sass-file-two', function () {
console.log('compiled sass-file-two')
});
gulp.task('compile-all-sass', ['sass-file-one','sass-file-two']);
то вы можете просто запустить gulp compile-all-sass
Ответ 11
Я не уверен, правильно ли я понимаю вопрос, но если я понимаю, это должно быть простое решение:
gulp.task('sass', ['bootstrap-sass', 'site-sass']);