2017-01-22 5 views
2

jsonを結合する多くのgulpプラグインが見つかりましたが、それらは常にフォルダ構造を破棄してデータをマージします。彼らは同じ構造を持っているので、私は私が見つけたすべてのプラグインで取得する出力は次の言語で、次のいずれかによってオーバーライド各カードおよび各プロパティになるだろうフォルダ構造を維持するgulpタスクを組み合わせたJSON - クロスプラットフォーム

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で試してみましたが、データがWindowsのパスを追跡しないため、Linux環境でのみ動作しました。 は、ここで私はそれは深さ5(私は...コールバックでの再帰的な思考とあまりよくありませんよ)まで、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)); 
}; 

に渡されたコールバックです。

このプラグインには何かがありますか? WindowsとLinuxの両方で動作するプラグインはありますか?

答えて

1

最後に、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": { ... }, 
      ... 
     }, 
     ... 
    } 
} 
+1

あなたはpath.sepを簡素化することができます:https://nodejs.org/api/path.html#path_path_sep – Mark

関連する問題