Mise à jour des références de fichiers dans un fichier json via une tâche grunge

Je suis un développeur de JavaScript et assez nouveau pour créer un processus de construction à partir de rien. J'ai choisi d'utiliser Grunt pour mon projet actuel et j'ai créé un GruntFile qui fait environ 90% de ce dont j'ai besoin et ça fonctionne très bien, à l'exception de ce problème. J'ai plusieurs fichiers JavaScript que je fais référence alors que je développe une extension chrome dans le fichier manifest.json . Pour mon processus de construction, je concatène tous ces fichiers et le minimise en un seul fichier à inclure dans manifest.json . Est-il possible de mettre à jour les références de fichier dans le fichier manifest.json pendant le processus de construction afin qu'il indique la version minifiée?

Voici un extrait du fichier manifeste src:

 { "content_scripts": [{ "matches": [ "http://*/*" ], "js": [ "js/lib/zepto.js", "js/injection.js", "js/plugins/plugin1.js", "js/plugins/plugin2.js", "js/plugins/plugin3.js", "js/injection-init.js" ] }], "version": "2.0", } 

J'ai une tâche grincheuse qui concatène et minifie tous les fichiers js répertoriés ci-dessus dans un fichier appelé injection.js et voudrais une tâche grunge qui peut modifier le fichier manifeste pour qu'il ressemble à ceci:

 { "content_scripts": [{ "matches": [ "http://*/*" ], "js": [ "js/injection.js" ] }], "version": "2.0", } 

Ce que j'ai fait pour l'instant est avoir 2 versions du fichier manifeste, un pour dev et un pour la construction, pendant le processus de construction, il copie la version à la place. Cela signifie que j'ai besoin de maintenir 2 versions que je préfère ne pas faire. Est-il possible de le faire plus élégamment avec Grunt?

Grunt donne son propre api pour la lecture et l'écriture de fichiers, je pense que mieux que d'autres dépendances comme fs : Edit / update json file using grunt avec commande grunt updatejson:key:value après avoir mis cette tâche dans votre fichier gruntjs

 grunt.registerTask('updatejson', function (key, value) { var projectFile = "path/to/json/file"; if (!grunt.file.exists(projectFile)) { grunt.log.error("file " + projectFile + " not found"); return true;//return false to abort the execution } var project = grunt.file.readJSON(projectFile);//get file as json object project[key]= value;//edit the value of json object, you can also use projec.key if you know what you are updating grunt.file.write(projectFile, JSON.stringify(project, null, 2));//serialize it back to file }); 

Je fais quelque chose de similaire – vous pouvez charger votre manifeste, mettre à jour le contenu, puis le sérialiser. Quelque chose comme:

 grunt.registerTask('fixmanifest', function() { var tmpPkg = require('./path/to/manifest/manifest.json'); tmpPkg.foo = "bar"; fs.writeFileSync('./new/path/to/manifest.json', JSON.stringify(tmpPkg,null,2)); }); 

Je ne suis pas d'accord avec les autres réponses ici.

1) Pourquoi utiliser grunt.file.write au lieu de fs ? grunt.file.write est juste une enveloppe pour fs.writeFilySync (voir le code ici ).

2) Pourquoi utiliser fs.writeFileSync lorsque grunt rend vraiment facile de faire des choses de manière asynchrone? Il ne fait aucun doute que vous n'avez pas besoin d'être synchronisé dans un processus de construction, mais s'il est facile à faire, pourquoi ne le feriez-vous pas ? (Il ne s'agit en fait que d'un couple de caractères plus long que l'implémentation writeFileSync .)

Je suggérerais ce qui suit:

 var fs = require('fs'); grunt.registerTask('writeManifest', 'Updates the project manifest', function() { var manifest = require('./path/to/manifest'); // .json not necessary with require manifest.fileReference = '/new/file/location'; // Calling this.async() returns an async callback and tells grunt that your // task is asynchronous, and that it should wait till the callback is called fs.writeFile('./path/to/manifest.json', JSON.stringify(manifest, null, 2), this.async()); // Note that "require" loads files relative to __dirname, while fs // is relative to process.cwd(). It's easy to get burned by that. });