2017-01-22 32 views
2

雖然我發現了許多結合json的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,它只能在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上運行的插件?

回答

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