目标
我目前正在尝试为NPM平台编写一个可以很容易地在Gulp任务中使用的Gulp包装器。我觉得这对Node社区很有用,也能实现我的目标。存储库在这里,每个人都可以查看、贡献、处理和拉请求。我正在尝试制作多个JSON文件的扁平副本(使用点符号)。然后,我想将它们复制到同一个文件夹中,只需修改文件扩展名就可以从*.json转到*.flat.json。
我的问题
我在JSON文件中得到的结果看起来像乙烯基文件或字节码。例如,我期望输出类似于"views.login.usernamepassword.login.text": "Login",但是我得到了类似于{"0":123,"1":13,"2":10,"3":9,"4":34,"5":100,"6":105 ...etc的东西
我的方法
我对开发Gulp任务和节点模块非常陌生,所以一定要注意那些根本错误的事情。
存储库将是最最新的代码,但我也将努力使问题跟上它。
Gulp-任务文件
var gulp = require('gulp'),
plugins = require('gulp-load-plugins')({camelize: true});
var gulpFlat = require('gulp-flat');
var gulpRename = require('gulp-rename');
var flatten = require('flat');
gulp.task('language:file:flatten', function () {
return gulp.src(gulp.files.lang_file_src)
.pipe(gulpFlat())
.pipe(gulpRename( function (path){
path.extname = '.flat.json'
}))
.pipe(gulp.dest("App/Languages"));
});节点模块的index.js (A.k.a ),我希望它变成一元化()
var through = require('through2');
var gutil = require('gulp-util');
var flatten = require('flat');
var PluginError = gutil.PluginError;
// consts
const PLUGIN_NAME = 'gulp-flat';
// plugin level function (dealing with files)
function flattenGulp() {
// creating a stream through which each file will pass
var stream = through.obj(function(file, enc, cb) {
if (file.isBuffer()) {
//FIXME: I believe this is the problem line!!
var flatJSON = new Buffer(JSON.stringify(
flatten(file.contents)));
file.contents = flatJSON;
}
if (file.isStream()) {
this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported! NYI'));
return cb();
}
// make sure the file goes through the next gulp plugin
this.push(file);
// tell the stream engine that we are done with this file
cb();
});
// returning the file stream
return stream;
}
// exporting the plugin main function
module.exports = flattenGulp;资源
发布于 2016-02-22 23:33:47
关于错误在哪里,你是对的。解决办法很简单。您只需要解析file.contents,因为flatten函数在对象上运行,而不是在缓冲区上操作。
...
var flatJSON = new Buffer(JSON.stringify(
flatten(JSON.parse(file.contents))));
file.contents = flatJSON;
...这应该能解决你的问题。
既然你是个新手,我希望你不介意我提个建议。您可能需要考虑给您的用户提供美化JSON输出的选项。要做到这一点,只需让您的主函数接受一个options对象,然后您就可以执行如下操作:
...
var flatJson = flatten(JSON.parse(file.contents));
var jsonString = JSON.stringify(flatJson, null, options.pretty ? 2 : null);
file.contents = new Buffer(jsonString);
...如果您计划在将来扩展插件,您可能会发现options对象在其他方面很有用。
可以随意查看我编写的一个名为格利普变换的插件的存储库。我很高兴回答有关这方面的任何问题。(例如,如果您愿意的话,我可以给您一些关于实现插件的流模式版本的指导)。
更新
我决定接受你的捐款邀请。您可以查看我的分叉这里和我打开的这里问题。欢迎您使用您喜欢的多或少,如果您真的喜欢,我总是可以提交一个拉请求。希望它至少能给你一些想法。
谢谢你让这个项目顺利进行。
https://stackoverflow.com/questions/35564976
复制相似问题