吞咽任务竞赛条件
问题描述:
我有一个吞咽任务(a)同步的问题。以下是我的gulp文件。基本上,我想先清理目录,然后将一些文件复制/生成到新目录中。问题在于竞争状态。我需要执行clean
和然后执行所有其余的(在build
任务内)。吞咽任务竞赛条件
当前的执行或者按预期完成,或者由于竞争条件导致ENOENT目录不存在而失败。
var gulp = require('gulp');
var concat = require('gulp-concat');
var clean = require('gulp-clean');
var cleanCSS = require('gulp-clean-css');
var cfg = {
js: {
vendor: [
'./node_modules/angular/angular.min.js',
'./node_modules/angular-translate/dist/angular-translate.min.js',
'./node_modules/angular-bootstrap/ui-bootstrap.min.js',
'./node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js'
],
app: './app/js/*'
},
css: {
vendor: [
'./node_modules/bootstrap/dist/css/bootstrap.css',
'./node_modules/font-awesome/css/font-awesome.css'
],
app: './app/css/*'
}
};
gulp.task('clean', function() {
return gulp.src('./dist', {read: false})
.pipe(clean());
});
gulp.task('vendor-js', function() {
return gulp.src(cfg.js.vendor)
.pipe(concat('vendor.js'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('app-js', function() {
return gulp.src(cfg.js.app)
.pipe(concat('app.js'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('vendor-css', function() {
return gulp.src(cfg.css.vendor)
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(concat('vendor.css'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('app-css', function() {
return gulp.src(cfg.css.app)
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(concat('app.css'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('fonts', function() {
gulp.src('./app/fonts/**/*')
.pipe(gulp.dest('./dist/fonts'));
gulp.src('./node_modules/font-awesome/fonts/**/*')
.pipe(gulp.dest('./dist/fonts'));
});
gulp.task('build', [
'clean',
'vendor-js',
'app-js',
'vendor-css',
'app-css',
'fonts'
]);
gulp.task('default', ['build']);
答
实际上,对于串行(同步)任务一饮而尽支持是有点蹩脚,需要做的克服,因为它是不是应用的非标要求...
由于clean
任务是已经做了一回,这项工作是:
- 定义任务依赖于
clean
对于需要它 - 后各单项任务,从去除
最终的解决方案是:
var gulp = require('gulp');
var concat = require('gulp-concat');
var clean = require('gulp-clean');
var uglify = require('gulp-uglify');
var cleanCSS = require('gulp-clean-css');
var cfg = {
js: {
vendor: [
'./node_modules/angular/angular.min.js',
'./node_modules/angular-translate/dist/angular-translate.min.js',
'./node_modules/angular-bootstrap/ui-bootstrap.min.js',
'./node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js'
],
app: './app/js/*'
},
css: {
vendor: [
'./node_modules/bootstrap/dist/css/bootstrap.css',
'./node_modules/font-awesome/css/font-awesome.css'
],
app: './app/css/*'
},
fonts: [
'./app/fonts/**/*',
'./node_modules/font-awesome/fonts/**/*',
'./node_modules/bootstrap/fonts/**/*'
]
};
gulp.task('clean', function() {
return gulp.src('./dist', {read: false})
.pipe(clean());
});
gulp.task('vendor-js', ['clean'], function() {
return gulp.src(cfg.js.vendor)
.pipe(concat('vendor.js'))
.pipe(gulp.dest('./dist/'));});
gulp.task('app-js', ['clean'], function() {
return gulp.src(cfg.js.app)
.pipe(uglify('app.js'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('vendor-css', ['clean'], function() {
return gulp.src(cfg.css.vendor)
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(concat('vendor.css'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('app-css', ['clean'], function() {
return gulp.src(cfg.css.app)
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(concat('app.css'))
.pipe(gulp.dest('./dist/'));
});
gulp.task('fonts', function() {
gulp.src(cfg.fonts)
.pipe(gulp.dest('./fonts'));
});
gulp.task('build', [
'vendor-js',
'app-js',
'vendor-css',
'app-css',
'fonts'
]);
gulp.task('default', ['build']);
什么版本一饮而尽您使用的是? –
'gulp.task('default',['clean','build'])'并将其从'build'任务中移除 –
[如何同步/一个接一个地运行Gulp任务] //stackoverflow.com/questions/22824546/how-to-run-gulp-tasks-synchronously-one-after-the-other) –