J'ai besoin de compresser un répertoire entier en utilisant Node.js. J'utilise actuellement node-zip et chaque fois que le processus s'exécute, il génère un fichier ZIP non valide (comme vous pouvez le voir dans ce problème Github ).
Existe-t-il une autre option, meilleure, Node.js qui me permettra de compresser un répertoire?
EDIT: j'ai fini par utiliser l' archiveur
writeZip = function(dir,name) {
var zip = new JSZip(),
code = zip.folder(dir),
output = zip.generate(),
filename = ['jsd-',name,'.zip'].join('');
fs.writeFileSync(baseDir + filename, output);
console.log('creating ' + filename);
};
exemple de valeur pour les paramètres:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
MISE À JOUR: Pour ceux qui posent des questions sur l'implémentation que j'ai utilisée, voici un lien vers mon téléchargeur :
zip
commande unix inclut toute la hiérarchie de dossiers parents du répertoire de travail actuel dans le fichier compressé. Cela pourrait vous convenir, ce n'était pas pour moi. La modification du répertoire de travail actuel dans child_process n'affecte pas non plus les résultats. 2) Pour surmonter ce problème, vous devez utiliserpushd
pour sauter dans le dossier que vous allez compresser etzip -r
, mais comme ilpushd
est intégré à bash et non à / bin / sh, vous devez également utiliser / bin / bash. Dans mon cas particulier, cela n'a pas été possible. Juste un avertissement.child_process.exec
vous permet de spécifier le cwd à partir duquel vous souhaitez exécuter la commande. La modification du CWD résout le problème de la hiérarchie des dossiers parents. Il résout également le problème de ne pas avoir besoinpushd
. Je recommande pleinement child_process.Réponses:
J'ai fini par utiliser l' archiveur lib. Fonctionne très bien.
Exemple
la source
.bulk
est obsolèteJe ne prétends pas montrer quelque chose de nouveau, je veux juste résumer les solutions ci-dessus pour ceux qui aiment utiliser les fonctions Promise dans leur code (comme moi).
J'espère que cela aidera quelqu'un;)
la source
Utilisez l'
child_process
API native de Node pour ce faire.Pas besoin de bibliothèques tierces. Deux lignes de code.
J'utilise l'API synchrone. Vous pouvez utiliser
child_process.exec(path, options, callback)
si vous avez besoin d'async. Il y a beaucoup plus d'options que de simplement spécifier le CWD pour affiner davantage vos demandes. Voir la documentation exec / execSync .Remarque: cet exemple suppose que l'utilitaire zip est installé sur votre système (au moins, il est fourni avec OSX). Certains systèmes d'exploitation peuvent ne pas avoir d'utilitaire installé (c'est-à-dire que le runtime AWS Lambda n'en a pas). Dans ce cas, vous pouvez facilement obtenir le binaire de l'utilitaire zip ici et le conditionner avec le code source de votre application (pour AWS Lambda, vous pouvez également le conditionner dans une couche Lambda), ou vous devrez soit utiliser un module tiers (dont il y en a beaucoup sur NPM). Je préfère la première approche, car l'utilitaire ZIP est essayé et testé depuis des décennies.
la source
zip
.Archive.bulk
est désormais obsolète, la nouvelle méthode à utiliser pour cela est glob :la source
Pour inclure tous les fichiers et répertoires:
Il utilise node-glob ( https://github.com/isaacs/node-glob ) en dessous, donc toute expression correspondante compatible avec cela fonctionnera.
la source
Ceci est une autre bibliothèque qui zippe le dossier en une seule ligne: zip-local
la source
Pour diriger le résultat vers l'objet de réponse (scénarios où il est nécessaire de télécharger le zip plutôt que de stocker localement)
Les conseils de Sam pour accéder au contenu du répertoire ont fonctionné pour moi.
la source
Adm-zip a des problèmes lors de la simple compression d'une archive existante https://github.com/cthackers/adm-zip/issues/64 ainsi que la corruption lors de la compression de fichiers binaires.
J'ai également rencontré des problèmes de corruption de compression avec node-zip https://github.com/daraosn/node-zip/issues/4
node-archiver est le seul qui semble bien fonctionner pour la compression, mais il n'a aucune fonctionnalité de décompression.
la source
J'ai trouvé cette petite bibliothèque qui résume ce dont vous avez besoin.
https://www.npmjs.com/package/zip-a-folder
la source
Comme il
archiver
n'est pas compatible avec la nouvelle version de webpack depuis longtemps, je recommande d'utiliser zip-lib .la source
Vous pouvez essayer de manière simple:
Installer
zip-dir
:et utilisez-le
la source
J'ai fini par emballer l'archiveur pour émuler JSZip, car la refactorisation à travers mon projet ne demanderait pas trop d'efforts. Je comprends qu'Archiver n'est peut-être pas le meilleur choix, mais c'est parti.
la source