是否可以在运行依赖项之前在gulp任务中分配变量?

wis*_*sew 20 javascript node.js gulp

我试图根据变量的值有条件地管道文件流,作为定义两个独立构建环境(即开发和生产)的方法.

某些任务可以使用命令行标志单独运行,如下所示: 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 }));
});
Run Code Online (Sandbox Code Playgroud)

我有一个build任务,它将许多其他任务称为依赖项(例如,包括此scripts任务).我希望此build任务运行任务依赖项之前分配一个变量(env在本例中).这意味着:

gulp.task('build', ['scripts', 'styles', 'otherstuff'], function() {
  env = 'production';
}
Run Code Online (Sandbox Code Playgroud)

不起作用,因为依赖项在任务正文之前运行.

我目前已经实现了gulp.start:

gulp.task('build', function() {
  env = 'production';
  gulp.start('scripts');
});
Run Code Online (Sandbox Code Playgroud)

但该.start方法实际上并不是gulp的公共API的一部分 - 它来自Orchestrator - 并不打算用于任何事情.此外,等效方法gulp.run在API之前已被弃用.

所以我想知道 - 在运行其依赖项之前,还有另一种方法可以在任务中分配变量吗?

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

Eva*_*oll 19

正确的方式

我不同意@Justin.用任务定义环境变量是一个想法的hackjob.用gutil.env这种方式可以做得更好.

gulp --env prod task

gulp.task( 'myTask', () => { console.log( gutil.env.env ) } )
Run Code Online (Sandbox Code Playgroud)

从现在开始,你已经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);
});
Run Code Online (Sandbox Code Playgroud)

同开发商(phated)总是说,使用ENV ...

更不用说,您应该使用环境变量或命令行标志来控制这种类型的逻辑. - 逐步

据推测,他指的是使用gutil.noop()in gulp-util的文档:

// 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/'));
});
Run Code Online (Sandbox Code Playgroud)


Jus*_*ard 14

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

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']);
Run Code Online (Sandbox Code Playgroud)

这里的问题是你的任务将并行运行,这意味着set-production任务可以在其他任务之后运行.您可以使用run-sequence包解决此问题.

var runSequence = require('run-sequence');
gulp.task('build', function(callback) {
  runSequence('set-production', ['scripts', 'styles', 'otherstuff'], callback);
});
Run Code Online (Sandbox Code Playgroud)

这将运行set-production第一个任务,然后再运行scripts,styles以及otherstuff在并行任务.