Вам потребуется изменить поток вручную - вероятно, наиболее используемый пакет для этой цели - через2 . Оказавшись в обратном вызове through2, вы можете передать поток своим плагинам gulp (при условии, что их функции преобразования доступны) и условно передать им параметры. Например, вот задача:
pugtest = () => {
const dataSet = {
'top.pug': {
foo: "alpha",
bar: "bravo"
},
'about.pug': {
foo: "charlie",
bar: "delta"
}
};
return gulp.src('src/**/*.pug')
.pipe(through2.obj((file, enc, next) =>
gulpPlugins.pug({
// Grab the filename, and set pug data to the value found in dataSet by that name
data: dataSet[file.basename] || {}
})._transform(file, enc, next)
))
.pipe(through2.obj((file, enc, next) => {
const options = {
indent_char: ' ',
indent_size: 4
};
if(file.relative.match(/admin\//)) {
options.indent_size = 2;
} else if(file.relative.match(/auth\//)) {
options.indent_size = 3;
}
file.contents = new Buffer.from(html.prettyPrint(String(file.contents), options), enc);
next(null, file);
}))
.pipe(gulp.dest('output'));
}
Для шага pug мы вызываем through2.obj
и создаем плагин pug, передавая ему данные, извлеченные из литерала нашего объекта, проиндексированного по имени файла в этом примере. Итак, теперь данные, передаваемые в компилятор, поступают из этого литерала объекта.
Для упомянутого вами шага html gulp- html -prettify не предоставляет свою функцию преобразования, поэтому мы не можем добраться до него и передать преобразование обратно в поток. Но в этом случае все нормально, если вы посмотрите на источник, это просто оболочка для prettyPrint
в пакете html. Это буквально все, что он делает. Таким образом, мы можем просто ускорить наш шаг, используя through2, чтобы сделать то же самое, но изменив наши параметры на основе относительного пути винилового файла.
Вот и все! Рабочий пример см. В этом репо: https://github.com/joshdavenport/stack-overflow-61314141-gulp-pug-conditional