在Gulp 3.9.1

时间:2018-01-29 16:47:29

标签: node.js gulp pipe uuid gulp-print

使用gulp 3.9.1

我正在尝试返回一堆文件,并执行一项需要在两个管道之间传递var的任务。

  1. 我正在使用node uuid为每个文件路径创建一个v3 UUID 最终每个页面最终都有一个uuid。我正在使用gulp-print抓取文件路径。
  2. 我想将uuid值存储为var。在下一个管道Im使用 gulp-inject-string在构建期间将其写入页面。
  3. 帮助:我需要帮助获取gulp-inject-string管道内的文件路径,或者我需要在两个不同的管道之间传递var。如果我在src之外全局设置一个默认值的var,它会很容易地传递给管道(注入)。

    以下超级简化代码:

    // 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 个答案:

答案 0 :(得分:0)

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作为索引的数组。但我会首先尝试它只是一个简单的值。

答案 1 :(得分:0)

我解决了这个问题。这是一个业余的错误。我返回了设置var的语句,因此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/./'));
});

var uuid 现在通过管道就好了。此代码基于跨平台文件路径创建UUID,并将其注入空的dc.identifier元标记。