虽然我发现许多结合了json的gulp插件,但它们始终会丢弃文件夹结构以合并数据。
我将使用这种结构:
game-data/
|____ cards/
| |__ card1.json
| |__ card2.json
| |__ ...
|____ infos/
|___ en
| |__ properties1.json
| |__ properties2.json
|___ fr
| |__ properties1.json
| |__ properties2.json
|___ es
|__ properties1.json
|__ properties2.json
我发现的每个插件提供的输出将使每张卡被下一张替代,而每个属性被下一种语言替代,因为它们具有相同的结构。
我确实尝试了gulp-json-concat,它仅在linux环境下工作,因为数据无法跟踪Windows路径。
这是我传递给的回调
// paths.resources:
resources: ['./public/gameData/**/*.json']
// gulpfile.json
return gulp.src(paths.resources)
.pipe(plugins.jsonConcat('gameData.json',jsonFolderParser))
.pipe(gulp.dest(paths.distDev + '/gameData/'));
// Callback
var jsonFolderParser = function (data) {
var computed = {};
for (var i in data) {
var keys = i.split("/");
if (!computed[keys[0]]) {
computed[keys[0]] = {};
}
if (keys.length == 2) {
computed[keys[0]][keys[1]] = data[i]
} else if (keys.length == 3) {
if (!computed[keys[0]][keys[1]]) {
computed[keys[0]][keys[1]] = {};
}
computed[keys[0]][keys[1]][keys[2]] = data[i]
} else if (keys.length == 4) {
if (!computed[keys[0]][keys[1]][keys[2]]) {
computed[keys[0]][keys[1]][keys[2]] = {};
}
computed[keys[0]][keys[1]][keys[2]][keys[3]] = data[i]
} else if (keys.length == 5) {
if (!computed[keys[0]][keys[1]][keys[2]][keys[3]]) {
computed[keys[0]][keys[1]][keys[2]][keys[3]] = {};
}
computed[keys[0]][keys[1]][keys[2]][keys[3]][keys[4]] = data[i]
}
}
return new Buffer(JSON.stringify(computed));
};
它可以在linux上运行,最大深度为5(我对回调中的递归思考不太满意...),并且在Windows上不起作用。
这个插件我缺少什么吗?是否有在Windows和Linux dist上均可使用的插件?
最佳答案
最后,我最终删除了gulp-json-concat,转而使用gulp-merge-json。
这是我的解决方案的代码:
return gulp.src(paths.resources)
.pipe(plugins.mergeJson('gameData.json', function(parsedJson, file) {
var filePath = file.path.replace(file.base, "").replace(".json", "");
if (filePath.indexOf("\\") !== -1) {
// Windows
filePath = filePath.split('\\');
} else {
// Linux
filePath = filePath.split('/');
}
var finalJson = parsedJson;
for (var i = filePath.length - 1; i >= 0 ; i--) {
var tmp = {};
tmp[filePath[i]] = finalJson;
finalJson = tmp;
}
return finalJson;
}))
.pipe(gulp.dest(paths.distDev + '/game_data/'));
首先,它根据使用的分隔符(是Windows还是Linux)来分隔路径名。
然后,我们以相反的方式构造对象,将每次迭代包含下一个迭代。
结果是:
{
"cards": {
"card1": { data contained in the json },
"card2": { ... },
...
},
"infos": {
"en": {
"properties1": { ... },
...
},
...
}
}
关于json - JSON结合gulp任务以保持文件夹结构-跨平台,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41791907/