我正在寻找使用Grunt组合保持某种结构的json文件的最佳方法.
这些文件以如下结构放置在文件夹中:
App ├── locales │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ └── fr │ └── translation.json └── widgets ├── Posts │ └── locales │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ └── fr │ └── translation.json ├── Comments │ └── locales │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ └── fr │ └── translation.json └── Links ├── locales │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ └── fr │ └── translation.json
合并文件的所需输出将是:
App │ ├── lang │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ └── fr │ └── translation.json ├── locales └── widgets
到目前为止,我想出了一个使用grunt-contrib-concat的解决方案,但我认为应该有更好的方法来实现它.
concat: {
translateEN: {
src: [
'www/js/app/locales/en/*.json',
'www/js/app/widgets/posts/locales/en/*.json',
'www/js/app/widgets/comments/locales/en/*.json',
'www/js/app/widgets/links/locales/en/*.json'
],
dest: 'www/js/app/lang/en/translation.json',
options: {
banner: '{',
footer: "}",
separator: ','
}
},
translateES: {
src: [
'www/js/app/locales/es/*.json',
'www/js/app/widgets/posts/locales/es/*.json',
'www/js/app/widgets/comments/locales/es/*.json',
'www/js/app/widgets/links/locales/es/*.json'
],
dest: 'www/js/app/lang/es/translation.json',
options: {
banner: '{',
footer: "}",
separator: ','
}
},
translateFR: {
src: [
'www/js/app/locales/fr/*.json',
'www/js/app/widgets/posts/locales/fr/*.json',
'www/js/app/widgets/comments/locales/fr/*.json',
'www/js/app/widgets/links/locales/fr/*.json'
],
dest: 'www/js/app/lang/fr/translation.json',
options: {
banner: '{',
footer: "}",
separator: ','
}
}
}
最佳答案 我最终为此写了我自己的咕噜声任务:
grunt.task.registerMultiTask('buildLocales', 'Build Locale files.', function() {
var that = this,
len = this.filesSrc.length,
outputDir,
outputFile,
originalFile,
destFile,
merged;
var jsonConcat = function(object1, object2) {
var key, a1, a2;
for (key in object2) {
if (object2.hasOwnProperty(key)) {
a2 = object2[key];
a1 = object1[key];
if (a1) {
a1.push.apply(a1, a2);
} else {
object1[key] = a2;
}
}
}
return object1;
};
var iterateTroughFiles = function(abspath, rootdir, subdir, filename){
if (abspath.indexOf('/.svn') === -1){
outputDir = that.data.dest + '/' + subdir;
outputFile = outputDir + '/' + filename;
// If output dir doesnt exists, then create it
if (!grunt.file.exists(outputDir)) {
grunt.file.mkdir(outputDir);
}
originalFile = grunt.file.readJSON(abspath);
// if dest file doenst exist, then just copy it.
if (!grunt.file.exists(outputFile)) {
grunt.file.write(outputFile, JSON.stringify(originalFile));
} else {
// read source file, read dest file. merge them. write it in dest file
destFile = grunt.file.readJSON(outputFile);
merged = jsonConcat(destFile, originalFile);
grunt.file.write(outputFile, JSON.stringify(merged));
}
}
};
for (var x = 0; x < len; x++) {
grunt.file.recurse(this.filesSrc[x], iterateTroughFiles);
}
});
实现是这样的:
buildLocales: {
locales:{
src: [
'www/js/app/**/locales'
],
dest: PATH_BUILD_LANGUAGES
}
},