我正在尝试根据变量的值有条件地管道文件流,作为定义两个独立构建环境(即开发和生产(的一种方式。
某些任务可以使用命令行标志单独运行,如下所示: gulp scripts --env production
然后将执行一些仅生产管道步骤:
gulp.task('scripts', function() {
var jsFilter = filter(['*.js']),
appFiles;
return gulp.src(appFiles)
.pipe(jsFilter)
.pipe(concat('application-build.js'))
.pipe(gulpif(env === 'production', uglify()))
.pipe(size())
.pipe(gulpif(env === 'production', gulp.dest('dist/js'), gulp.dest('tmp/js')))
.pipe(browserSync.reload({ stream: true }));
});
我有一个build
任务,它将许多其他任务调用为依赖项(例如,包括此scripts
任务(。我希望这个build
任务在运行任务依赖项之前分配一个变量(在本例中为 env
(。这意味着:
gulp.task('build', ['scripts', 'styles', 'otherstuff'], function() {
env = 'production';
}
不起作用,因为依赖项在任务正文之前运行。
我目前已使用 gulp.start
实现它:
gulp.task('build', function() {
env = 'production';
gulp.start('scripts');
});
但是.start
方法实际上并不是gulp公共API的一部分 - 它来自Orchestrator - 并且不打算用于任何事情。另外,gulp.run
等效方法不久前已从 API 中弃用。
所以我想知道 - 在运行其依赖项之前,有没有另一种方法可以在任务中分配变量?
(或者也许有更好的方法来实现类似 gulp 构建环境的东西?
正确的方式
我不同意@Justin。用任务定义环境变量是一个想法的黑客工作。最好用这种方式gutil.env
来完成。
gulp --env prod task
gulp.task( 'myTask', () => { console.log( gutil.env.env ) } )
现在从这一点开始,您已经设置gulp.env.env
了。
或者,或者,你可以像这张票中的这个例子一样......它解决了Gulp开发人员的这个问题,他们首先建议使用环境变量,但提供这个习语。
function js(shouldMinify) {
return gulp.src('./js/*.js')
.pipe(concat('app.js'))
.pipe(gulpif(shouldMinify, uglify()))
.pipe(gulp.dest('js'));
});
gulp.task('develop', function () {
shouldMinify = false;
return js(shouldMinify);
});
gulp.task('build', function () {
shouldMinify = true;
return js(shouldMinify);
});
同一个开发人员(phated(总是说使用env...
更不用说,您应该使用环境变量或命令行标志来控制这种类型的逻辑。 - 腑
据推测,他指的是gulp-util
文档中gutil.noop()
的使用:
// gulp should be called like this :
// $ gulp --type production
gulp.task('scripts', function() {
gulp.src('src/**/*.js')
.pipe(concat('script.js'))
// LOOK BELOW: if we don't send to uglify, we push to noop stream.
.pipe(gutil.env.type === 'production' ? uglify() : gutil.noop())
.pipe(gulp.dest('dist/'));
});
您可以专门创建一个任务来设置环境,并在其他任务之前运行它。
gulp.task('set-production', function() {
env = 'production';
});
// Doesn't quite work because tasks are run in parallel
gulp.task('build', ['set-production', 'scripts', 'styles', 'otherstuff']);
这里的问题是您的任务将并行运行,这意味着set-production
任务可能会在其他任务之后运行。您可以使用run-sequence
包解决此问题。
var runSequence = require('run-sequence');
gulp.task('build', function(callback) {
runSequence('set-production', ['scripts', 'styles', 'otherstuff'], callback);
});
这将首先运行set-production
任务,然后并行运行scripts
、styles
和otherstuff
任务。