用流创建插件gulp

时间:2014-03-14 11:09:15

标签: javascript json plugins gulp

我在json文件中创建了发送json数据的插件。

但我不明白为什么在管道中发送我的对象json,而不是直接在我的插件中写文件。

我想用我的插件使用这种语法:

gulp.task('js-hash', function()
{
    // Get all js in redis
    gulp.src('./build/js/**/*.js')
        .pipe(getHashFile('/build/js/'))
       .pipe(gulp.dest('./build/js/hash.json'));
});

而不是那样:

gulp.task('js-hash', function()
{
    // Get all js in redis
    gulp.src('./build/js/**/*.js')
        .pipe(getHashFile('./build/js/hash.json', '/build/js/'));
});

这是我的插件:

var through = require('through2');
var gutil = require('gulp-util');
var crypto = require('crypto');
var fs = require('fs');
var PluginError = gutil.PluginError;

// Consts
const PLUGIN_NAME = 'get-hash-file';
var json = {};

function getHashFile(filename, basename)
{
    if (!filename) {
        throw PluginError(PLUGIN_NAME, "Missing filename !");
    }

    // Creating a stream through which each file will pass
    var stream = through.obj(function (file, enc, callback) {
        if (file.isNull()) {
            this.push(file); // Do nothing if no contents
          return callback();
        }

        if (file.isBuffer()) {
            var hash = crypto.createHash('sha256').update(String(file.contents)).digest('hex');
            json[file.path.replace(file.cwd+basename, '')] = hash;

            return callback();
        }

        if (file.isStream()) {
            this.emit('error', new PluginError(PLUGIN_NAME, 'Stream not supported!'));
            return callback();
        }
    }).on('finish', function () {
        fs.writeFile(filename, JSON.stringify(json), function(err) {
            if (err) {
                throw err;
            }
        });
    });


    // returning the file stream
    return stream;
}


// Exporting the plugin main function
module.exports = getHashFile;

你的想法

1 个答案:

答案 0 :(得分:3)

除了not respecting plugins guidelines之外,没有什么可以阻止你这样做了!

用户实际上假设一个插件会传输文件,并且可以将它们传输到其他插件。

如果我的代码正确,那么您正在尝试生成一个包含入站文件的所有sha哈希值的文件。为什么不让用户获取此文件并将其传递给其他插件?你会惊讶于人们可以做什么。

虽然这个问题看起来有点基于意见,但你绝对可以把重点放在如何处理可能不属于主要文件流的文件上。像这样的问题可以在许多插件中找到;例如,gulp-uglify authors are wondering how they can add source-maps without mixing js and source map downstream