Передача переменной между трубами в Gulp 3.9.1
Использование gulp 3.9.1
Я пытаюсь вернуть кучу файлов и выполнить задачу, требующую передачи переменной между двумя каналами.
- Я использую UUID узла, чтобы создать UUID v3 для каждого пути к файлу, чтобы в конечном итоге получить UUID для каждой страницы. Я беру путь к файлу с помощью gulp-print.
- Я хочу сохранить это значение uuid как var. В следующем канале я использую gulp-inject-string, чтобы записать его на страницу во время сборки.
Справка: Либо мне нужна помощь в получении пути к файлу внутри канала gulp-inject-string, либо мне нужно передать переменную между двумя различными каналами. Если я глобально установлю переменную var со значением по умолчанию вне src, она будет легко передана в канал (inject).
Супер упрощенный код ниже:
// test code
var gulp = require('gulp');
var print = require('gulp-print');
var inject = require('gulp-inject-string');
var reload = browserSync.reload;
const uuidv3 = require('uuid/v3');
var uuid;
gulp.task('uuid', function() {
return gulp.src('**/*.html'])
// create uuid
.pipe(print(function(filepath) {
uuid = uuidv3(filepath, uuidv3.URL);
return "compiled: " + filepath + ' uuid: ' + uuid;
}))
// need to to add UUIDv3 to each page
.pipe(inject.before('</head>', '<meta name="dc.identifier" content="' + uuid + '">'))
.pipe(gulp.dest('/prod/./'))
.pipe(reload({ stream: true }));
});
Стоит отметить, что мне нужен кроссплатформенный способ получения пути к файлу, начиная с корня проекта и включая прямые косые черты. Gulp (print) делает это прекрасно, начиная с корня проекта и игнорируя все, что находится выше по течению от этой точки. Формат пути важен, потому что он составляет половину уравнения при создании UUID, и UUID должны совпадать на платформах Mac или PC.
Примеры:
/index.html
/dir1/file.html
/dir1/dir2/dir3/file.html
2 ответа
Я решил проблему. Это была любительская ошибка. Я вернул оператор, в котором была установлена переменная var, поэтому переменная была по существу уничтожена. Обновленный код, который позволяет var проходить через каналы.
var gulp = require('gulp');
var print = require('gulp-print');
var replace = require('gulp-replace');
const uuidv3 = require('uuid/v3');
var uuid;
gulp.task('build', function() {
return gulp.src('**/*.html')
// get a cross-platform filepath and create a uuid
.pipe(print(function(filepath) {
uuid = uuidv3(filepath, uuidv3.URL);
}))
// inject uuid
.pipe(replace('dc.identifier" content=""', function() {
return 'dc.identifier" content="' + uuid + '"';
}))
.pipe(gulp.dest('/prod/./'));
});
Varuuid теперь проходит через трубы очень хорошо. Этот код создает UUID на основе кросс-платформенного пути к файлу и внедряет его в пустой метатег dc.identifier.
var gulp = require('gulp');
var print = require('gulp-print');
var inject = require('gulp-inject-string');
const uuidv3 = require('uuid/v3');
var tap = require('gulp-tap');
// you can declare here
var uuid;
gulp.task('pages', function() {
// or you can declare here
var uuid;
return gulp.src('**/*.html')
// bunch of stuff happens here involving templating/minifying
// create uuid
.pipe(print(function(filepath) {
// then set it here and use it further below
// it will be available
uuid = uuidv3(filepath, uuidv3.URL);
return "compiled: " + filepath + ' uuid: ' + uuid;
}))
// need to to add UUIDv3 to each page
//.pipe(inject.before('</head>', '<meta name="dc.identifier" content="' + uuid + '">\n'))
.pipe(tap(function(file, t) {
return t.through(inject.before('</head>', '<meta name="dc.identifier" content="' + uuid + '">\n');
})
.pipe(gulp.dest('/prod/./'))
.pipe(reload({stream:true}));
});
Вы просто создаете переменную с большей областью действия, которую вы можете установить и на которую будете ссылаться позже. Если вам нужно их множество, создайте массив с filepath в качестве индекса. Но я бы попробовал сначала как простое значение.