Передача переменной между трубами в Gulp 3.9.1

Использование gulp 3.9.1

Я пытаюсь вернуть кучу файлов и выполнить задачу, требующую передачи переменной между двумя каналами.

  1. Я использую UUID узла, чтобы создать UUID v3 для каждого пути к файлу, чтобы в конечном итоге получить UUID для каждой страницы. Я беру путь к файлу с помощью gulp-print.
  2. Я хочу сохранить это значение 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 в качестве индекса. Но я бы попробовал сначала как простое значение.

Другие вопросы по тегам