在运行依赖关系之前,是否可以在一个gulp任务中分配一个variables?

我试图有条件地根据variables的值来pipe理文件stream,作为定义两个单独构build环境(即开发和生产)的一种方式。

有些任务可以通过命令行标志单独运行,例如: gulp scripts --env production

然后将做一些生产专用的pipe道步骤:

 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任务运行任务依赖关系之前分配一个variables(在本例中为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 ,并不打算用于任何事情。 而且,前一段时间,API的等效方法gulp.run已经被弃用了。

所以我想知道是否有另一种方式,我可以在运行它的依赖之前分配一个variables在一个任务?

(或者也许有更好的方法来实现像gulp构build环境的东西?)

您可以专门创build一个任务来设置环境并在其他任务之前运行它。

 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任务,然后并行运行scriptsstylesotherstuff任务。

正确的方式

我不同意@Justin。 用一个任务来定义一个环境variables是一个想法的黑客。 用gutil.env这样做更好。

 gulp --env prod task gulp.task( 'myTask', () => { console.log( gutil.env.env ) } ) 

现在从这一点,你有gulp.env.env设置。

或者,你也可以像这个例子一样在这张票子里面做这个事情。这个从Gulp的开发者那里得到了第一个build议使用环境variables的人,但是提供了这个成语。

 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 …

更不用说,你应该用环境variables或命令行标志来控制这种types的逻辑。 – phated

据推测,他指的是在gutil.noop() 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/')); });