Подтвердить что ты не робот

Можно ли назначить переменную в задаче 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 }));
});

У меня есть задача 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 фактически не является частью общедоступного API gulp - он поступает из Orchestrator - и не предназначен для использования ни для чего. Кроме того, эквивалентный метод gulp.run был устаревшим из API некоторое время назад.

Итак, мне интересно - есть ли другой способ, которым я мог бы назначить переменную в задаче, прежде чем запускать ее зависимости?

(Или, может быть, есть лучший способ реализовать что-то вроде среды сборки в gulp?)

4b9b3361

Ответ 1

Вы можете создать задачу специально для установки среды и запуска ее перед другими задачами.

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.

Ответ 2

ПРАВИЛЬНЫЙ ПУТЬ

Я не согласен с @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...

Не говоря уже о том, что вы должны управлять этим типом логики с помощью переменных окружения или флагов командной строки. - phated

Предположительно, он ссылается на использование gutil.noop() в gulp-util docs:

// 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/'));
});