Gulp任务链接 [英] Gulp tasks chaining
问题描述
我正在使用gulp编译一些.less文件,并通过实时重载将更改注入浏览器.
I'm using gulp to compile some .less files and inject the changes in the browser with live-reload.
这是我最初创建的任务:
This is the task I originally created:
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
var plumber = require('gulp-plumber');
var livereload = require('gulp-livereload');
var path = require('path');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer-core');
var mqpacker = require('css-mqpacker');
var csswring = require('csswring');
gulp.task('less', function() {
var processors = [
autoprefixer({browsers: ["last 2 version", "> 1%", "ie 9", "ie 8", "ie 7", "ios 6"]}),
mqpacker,
csswring({
preserveHacks: true,
removeAllComments: true
})
];
gulp.src('./css/style.less') // only compile the entry file
.pipe(plumber())
.pipe(less({
paths: ['./css/'],
} ))
.pipe(postcss(processors))
.pipe(plumber.stop())
.pipe(gulp.dest('./css/'))
.pipe(livereload());
});
gulp.task('watch', function() {
gulp.watch('./**/*.less', ['less']); // Watch all the .less files, then run the less task
});
gulp.task('default', ['watch']); // Default will run the 'entry' watch task
我创建了另一个gulp任务来执行相同的任务,但是使用浏览器同步而不是实时重新加载进行交叉测试:
I created an other gulp task to perform the same tasks but using browser-sync instead of live-reload for cross testing:
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
var plumber = require('gulp-plumber');
var path = require('path');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer-core');
var csswring = require('csswring');
var browserSync = require('browser-sync').create();
var reload = browserSync.reload;
gulp.task('less', function() {
var processors = [
autoprefixer({browsers: ["last 2 version", "> 1%", "ie 9", "ie 8", "ie 7", "ios 6"]}),
csswring({
preserveHacks: true,
removeAllComments: true
})
];
gulp.src('./css/style.less') // only compile the entry file
.pipe(plumber())
.pipe(less({
paths: ['./css/']
} ))
.pipe(postcss(processors))
.pipe(plumber.stop())
.pipe(gulp.dest('./css/'))
.pipe(reload({stream: true}))
// .pipe(livereload());
});
gulp.task('serve', ['less'], function() {
browserSync.init({
proxy: "http://my-site.dev/"
});
gulp.watch("./css/*.less", ['less']);
});
然后,我尝试编译两个文件,以能够运行两个任务,这取决于我是在进行本地开发还是在测试.我创建了一个用于编译css的较少"任务,一个"lrl"实时重载监视任务和一个"bs"浏览器同步监视任务.我创建了"less"任务来删除重复项,但是现在当我更改CSS时,浏览器将重新加载所有内容,而不仅仅是注入CSS.
I then tried to compile both files to be able to run either task depending on if i'm doing local development or if testing. I've created a "less" task to compile the css, a "lrl" live reload watch task and a "bs" browser-sync watch task. I created the "less" task to remove the duplication but now when i change the css the browser reload everything instead of just injecting the css.
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
var plumber = require('gulp-plumber');
var path = require('path');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer-core');
var csswring = require('csswring');
var livereload = require('gulp-livereload');
var browserSync = require('browser-sync').create();
var reload = browserSync.reload;
gulp.task('less', function() {
var processors = [
autoprefixer({browsers: ["last 2 version", "> 1%", "ie 9", "ie 8", "ie 7", "ios 6"]}),
csswring({
preserveHacks: true,
removeAllComments: true
})
];
gulp.src('./css/style.less') // only compile the entry file
.pipe(plumber())
.pipe(less({
paths: ['./css/']
} ))
.pipe(postcss(processors))
.pipe(plumber.stop())
.pipe(gulp.dest('./css/'))
});
gulp.task('lrl',['less'], function(){
gulp.src('./css/style.less') // only compile the entry file
.pipe(livereload());
});
gulp.task('watch',['lrl'], function() {
livereload.listen();
gulp.watch('./**/*.less', ['lrl']); // Watch all the .less files, then run the less task
});
// browser-sync setup
gulp.task('bs',['less'], function(){
gulp.src('./css/style.less') // only compile the entry file
.pipe(reload({stream: true}))
});
gulp.task('serve', function() {
browserSync.init({
proxy: "http://my-site.dev/"
});
gulp.watch("./css/*.less", ['bs']);
gulp.watch("./js/script.js").on('change', reload);
gulp.watch("./templates/*.php").on('change', reload);
});
// run default task with live reload for local development
gulp.task('default', ['watch']); // Default will run the 'entry' watch task
我对在任务中调用任务的方式有些困惑.有没有办法确保注入css,以这种方式进行设计要快得多.
I'm a bit confused with the way to call tasks within tasks. Is there a way to make sure that the css are injected, it's much faster to work on design this way.
非常感谢
===================大编辑============================
=================== BIG EDIT ============================
我一直在弄乱运行顺序,但是我仍然有同样的问题.以某种方式,任务正在运行.使用默认任务,我只能在本地服务器上进行实时重载.使用 gulp serve
,我可以得到一台服务器,在其中可以调试浏览器和设备上的布局.问题是我不再得到css注入了.看起来gulp会不断重新运行所有任务,并刷新浏览器以重新连接它.
I've been messing about with run-sequence but I still have the same problem.
In some way the task is working. With the default task i get live-reload on my local server only. With gulp serve
I get a server where i can debug my layout across browsers and devices. The problem is that i don't get css injection anymore. it looks like gulp keeps re-running all of the tasks and refresh the browser to reconnect it.
所以我制作了一个具有重复代码的工作版本,以使我想变得更清楚
so I made a working version with duplicated code to make what i'm trying to achieve clearer
var gulp = require('gulp'),
less = require('gulp-less'),
watch = require('gulp-watch'),
plumber = require('gulp-plumber'),
path = require('path'),
postcss = require('gulp-postcss'),
autoprefixer = require('autoprefixer-core'),
mqpacker = require('css-mqpacker'),
csswring = require('csswring'),
livereload = require('gulp-livereload'),
browserSync = require('browser-sync').create(),
reload = browserSync.reload;
gulp.task('less-lrl', function() {
var processors = [
autoprefixer({browsers: ["last 2 version", "> 1%", "ie 9", "ie 8", "ie 7", "ios 6"]}),
mqpacker,
csswring({
preserveHacks: true,
removeAllComments: true
})
];
gulp.src('./css/style.less') // only compile the entry file
.pipe(plumber())
.pipe(less({
paths: ['./css/'],
} ))
.pipe(postcss(processors))
.pipe(plumber.stop())
.pipe(gulp.dest('./css/'))
.pipe(livereload());
});
gulp.task('watch', function() {
livereload.listen();
gulp.watch('./**/*.less', ['less-lrl']); // Watch all the .less files, then run the less task
});
gulp.task('less-bs', function() {
var processors = [
autoprefixer({browsers: ["last 2 version", "> 1%", "ie 9", "ie 8", "ie 7", "ios 6"]}),
mqpacker,
csswring({
preserveHacks: true,
removeAllComments: true
})
];
gulp.src('./css/style.less') // only compile the entry file
.pipe(plumber())
.pipe(less({
paths: ['./css/']
} ))
.pipe(postcss(processors))
.pipe(plumber.stop())
.pipe(gulp.dest('./css/'))
.pipe(reload({stream: true}))
});
gulp.task('serve', ['less-bs'], function() {
browserSync.init({
proxy: "http://myserver.dev"
});
gulp.watch("./css/*.less", ['less-bs']);
});
gulp.task('default', ['watch']); // Default will run the 'entry' watch task
当我这样做时,它运行顺利.但是我想避免"less-lrl"和"less-bs"任务中的代码重复.唯一不同的是 .pipe(livereload());
和 .pipe(reload({stream:true}))
When I do this it works smoothly. But I wanted to avoid the code duplication from the "less-lrl" and "less-bs" tasks. The only thing that differ is .pipe(livereload());
and .pipe(reload({stream: true}))
我的大脑中有些笨蛋,我不明白:)
There's some stoopid going on in my brain, i don't haz understand :)
推荐答案
如果我正确理解了您的问题,则 runSequence
将解决您的问题.在这里看看: https://www.npmjs.com/package/run-sequence
If I understood your question correctly, the runSequence
would solve your problem. Take a look here: https://www.npmjs.com/package/run-sequence
您只需要添加
var runSequence = require('run-sequence');
并创建一个运行所需任务的任务.例如:
And create a task that runs your desired ones. For example:
gulp.task('build', function(callback) {
return runSequence(
'less',
['lrl'],
callback
);
});
然后
gulp.task('watch',['build'], function() {
livereload.listen();
gulp.watch('./**/*.less', ['build']); // Watch all the .less files, then run the less task
});
这篇关于Gulp任务链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!