【问题标题】:Passing a variable between pipes in Gulp 3.9.1在 Gulp 3.9.1 中的管道之间传递变量
【发布时间】:2018-01-29 16:47:28
【问题描述】:

使用 gulp 3.9.1

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

  1. 我正在使用节点 uuid 为每个文件路径创建一个 v3 UUID 最终每个页面都有一个 uuid。我正在使用 gulp-print 获取文件路径。
  2. 我想将该 uuid 值存储为 var。在下一个管道中,我正在使用 gulp-inject-string 在构建期间将其写入页面。

帮助:要么我需要帮助来获取 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

【问题讨论】:

  • 只需在“return gulp.src....”之前声明一个 var,(或完全在任务之前),将其设置在打印管道中并稍后参考。如果您担心正确的斜杠,请查看节点路径库中的 path.sep(以及 path.join)。
  • 我不能在 gulp src 之外(或在任务之前)声明 var,因为那样我就不会使用在 src 中返回的文件的文件路径。跨度>

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


【解决方案1】:
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}));    
});

您只是在更高的范围内创建一个变量,您可以在以后设置和引用它。如果您需要一堆它们,请创建一个以文件路径为索引的数组。但我会先尝试一下,这只是一个简单的值。

【讨论】:

  • 我尝试在任务上方和任务内部在 gulp.src 之前声明一个空变量,正如您在示例中所拥有的那样,我确保我没有在管道内再次声明它( print) 通过删除 uuid 之前的文本“var”,并且在以 .pipe(inject.before....一个变量数组我也试过这个 var uuid = []; //定义数组页面 //循环遍历所有页面 for (i = 0; i
  • "udid" 未定义 - 你的意思是“uuid”吗?
  • 它也在你的原始代码中——我之前在我的代码中改变了它。在注入管中。
  • 原始问题中的错误代码是直接在本网站的网络表单中输入的结果 - 我的错在那里。我已经更新了原始问题,没有错字。还是不行,用 gulp-foreach 包裹怎么办?
  • 如果我设置 var uuid = "apples";在顶部,我将在控制台“uuid: b20be24d-3916-33c2-ab15-ff3446ed34d8”中返回一个有效的 UUID,并在注入的 HTML 中返回“apples”。
【解决方案2】:

我解决了这个问题。这是一个业余错误。我返回了设置 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 元标记中。

【讨论】:

  • 值得注意的是,您必须将这两个管道包装在 gulp-foreach 中,因为当流返回一堆文件时,会在一个管道中创建 UUID,但它可能不会将相同的 var 注入到原始管道中文件,有时另一个文件会在第二个管道中抓取它。 foreach 使其一次通过一个页面。
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多