虽然我发现许多结合了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/

10-12 12:51
查看更多