Necesito comprimir un directorio completo usando Node.js. Actualmente estoy usando node-zip y cada vez que se ejecuta el proceso genera un archivo ZIP no válido (como puede ver en este problema de Github ).
¿Hay otra opción de Node.js mejor que me permita comprimir un directorio?
EDITAR: terminé usando el archivador
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);
};
valor de muestra para los parámetros:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
ACTUALIZACIÓN: Para aquellos que preguntan sobre la implementación que utilicé, aquí hay un enlace a mi descargador :
zip
comando Unix incluye toda la jerarquía de carpetas principales del directorio de trabajo actual en el archivo comprimido. Esto podría estar bien para ti, no lo fue para mí. Además, cambiar el directorio de trabajo actual en child_process de alguna manera no afecta los resultados. 2) Para superar este problema, debe usarpushd
para saltar a la carpeta que comprimirá yzip -r
, pero comopushd
está integrado en bash y no en / bin / sh, también debe usar / bin / bash. En mi caso específico, esto no fue posible. Solo un aviso.child_process.exec
api del nodo de @johnozbay le permite especificar el cwd desde donde desea ejecutar el comando. Cambiar el CWD soluciona el problema de la jerarquía de la carpeta principal. También soluciona el problema de no necesitarpushd
. Recomiendo completamente child_process.Respuestas:
Terminé usando archiver lib. Funciona genial.
Ejemplo
fuente
.bulk
está obsoletoNo pretendo mostrar algo nuevo, solo quiero resumir las soluciones anteriores para aquellos a quienes les gusta usar las funciones de Promise en su código (como yo).
Espero que ayude a alguien;)
fuente
Utilice la
child_process
API nativa de Node para lograr esto.No se necesitan bibliotecas de terceros. Dos líneas de código.
Estoy usando la API síncrona. Puede usar
child_process.exec(path, options, callback)
si necesita async. Hay muchas más opciones además de especificar el CWD para afinar aún más sus solicitudes. Consulte los documentos exec / execSync .Tenga en cuenta: Este ejemplo asume que tiene la utilidad zip instalada en su sistema (viene con OSX, al menos). Es posible que algunos sistemas operativos no tengan la utilidad instalada (es decir, el tiempo de ejecución de AWS Lambda no). En ese caso, puede obtener fácilmente el binario de la utilidad zip aquí y empaquetarlo junto con el código fuente de su aplicación (para AWS Lambda también puede empaquetarlo en una Capa Lambda), o tendrá que usar un módulo de terceros (de los cuales hay muchos en NPM). Prefiero el enfoque anterior, ya que la utilidad ZIP se ha probado y probado durante décadas.
fuente
zip
.Archive.bulk
ahora está en desuso, el nuevo método que se utilizará para esto es glob :fuente
Para incluir todos los archivos y directorios:
Utiliza node-glob ( https://github.com/isaacs/node-glob ) debajo, por lo que cualquier expresión coincidente compatible con eso funcionará.
fuente
Esta es otra biblioteca que comprime la carpeta en una línea: zip-local
fuente
Para canalizar el resultado al objeto de respuesta (escenarios donde es necesario descargar el zip en lugar de almacenarlo localmente)
Las sugerencias de Sam para acceder al contenido del directorio funcionaron para mí.
fuente
Adm-zip tiene problemas al comprimir un archivo existente https://github.com/cthackers/adm-zip/issues/64 , así como la corrupción al comprimir archivos binarios.
También me encontré con problemas de corrupción de compresión con node-zip https://github.com/daraosn/node-zip/issues/4
node-archiver es el único que parece funcionar bien para comprimir, pero no tiene ninguna funcionalidad de descompresión.
fuente
Encontré esta pequeña biblioteca que encapsula lo que necesitas.
https://www.npmjs.com/package/zip-a-folder
fuente
Dado
archiver
que no es compatible con la nueva versión de webpack durante mucho tiempo, recomiendo usar zip-lib .fuente
Puedes probar de forma sencilla:
Instalar
zip-dir
:y usarlo
fuente
Terminé envolviendo el archivador para emular JSZip, ya que refactorizar a través de mi proyecto tomaría demasiado esfuerzo. Entiendo que Archiver no sea la mejor opción, pero aquí tienes.
fuente