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