linux - JSON kombinerer gulp-opgave, der holder mappestrukturen - cross platform

Indlæg af Hanne Mølgaard Plasc

Problem



Mens jeg fandt mange gulp-plugins, der kombinerer jsonen, kasserer de altid mappestrukturen for at fusionere dataene.
Min brug ville være med denne slags struktur:


game-data/
    |\_\_\_\_ cards/
    |       |\_\_ card1.json
    |       |\_\_ card2.json
    |       |\_\_ ...
    |\_\_\_\_ infos/
            |\_\_\_ en
            |     |\_\_ properties1.json
            |     |\_\_ properties2.json
            |\_\_\_ fr
            |     |\_\_ properties1.json
            |     |\_\_ properties2.json
            |\_\_\_ es
                  |\_\_ properties1.json
                  |\_\_ properties2.json


Udgangen jeg får med hvert plugin jeg fandt ville få hvert kort overstyret af den næste og hver egenskab ved det næste sprog, da de har de samme strukturer.


Jeg prøvede med gulp-json-concat, og det fungerede kun i et linux-miljø, da dataene ikke ville holde øje med Windows-stier.
Her er tilbagekaldelsen jeg passerede til [5]


// 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));
};


Det virker på linux, op til en dybde 5 (jeg er ikke så god med rekursiv tænkning i tilbagekaldelser ...) og det virker ikke på Windows.


Er der noget, jeg mangler med dette plugin? Er der et plugin, der virker på både Windows og Linux dist?

Bedste reference


Endelig endte jeg med at fjerne gulp-json-concat til fordel for gulp-merge-json. [6]


Her er koden til min løsning:


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/'));


For det første deler den stienavnet i henhold til separatoren, der anvendes, om det er Windows eller Linux.


Derefter konstruerer vi objektet i omvendt retning, og indleder hver iteration af den næste.


Resultatet er:


{
    "cards": {
        "card1": { data contained in the json },
        "card2": { ... },
        ...
    },
    "infos": {
        "en": {
            "properties1": { ... },
            ...
        },
        ...
    }
}