在运行依赖关系之前,是否可以在一个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
任务,然后并行运行scripts
, styles
和otherstuff
任务。
正确的方式
我不同意@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/')); });