Ich muss ein ganzes Verzeichnis mit Node.js komprimieren. Ich verwende derzeit Node-Zip und jedes Mal, wenn der Prozess ausgeführt wird, wird eine ungültige ZIP-Datei generiert (wie Sie aus diesem Github-Problem ersehen können ).
Gibt es eine andere, bessere Node.js-Option, mit der ich ein Verzeichnis komprimieren kann?
EDIT: Am Ende habe ich Archiver verwendet
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);
};
Beispielwert für Parameter:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
AKTUALISIEREN: Für diejenigen, die nach der von mir verwendeten Implementierung fragen, ist hier ein Link zu meinem Downloader :
zip
Befehl enthält die gesamte übergeordnete Ordnerhierarchie des aktuellen Arbeitsverzeichnisses in der komprimierten Datei. Das könnte für dich in Ordnung sein, es war nicht für mich. Auch das Ändern des aktuellen Arbeitsverzeichnisses in child_process wirkt sich irgendwie nicht auf die Ergebnisse aus. 2) Um dieses Problem zu lösen, müssen Siepushd
in den Ordner springen, den Sie komprimieren möchten, undzip -r
da erpushd
in bash und nicht in / bin / sh integriert ist, müssen Sie auch / bin / bash verwenden. In meinem speziellen Fall war dies nicht möglich. Nur ein Kopf hoch.child_process.exec
API von @johnozbay node können Sie den cwd angeben, von dem aus Sie den Befehl ausführen möchten. Durch Ändern des CWD wird das Problem der übergeordneten Ordnerhierarchie behoben. Es behebt auch das Problem, dass es nicht benötigt wirdpushd
. Ich kann child_process nur empfehlen.Antworten:
Am Ende habe ich archiver lib verwendet. Funktioniert super.
Beispiel
quelle
.bulk
ist veraltetIch gebe nicht vor, etwas Neues zu zeigen, sondern möchte nur die obigen Lösungen für diejenigen zusammenfassen, die Promise-Funktionen in ihrem Code verwenden möchten (wie ich).
Hoffe es wird jemandem helfen;)
quelle
Verwenden Sie dazu die native
child_process
API von Node .Keine Notwendigkeit für Bibliotheken von Drittanbietern. Zwei Codezeilen.
Ich verwende die synchrone API. Sie können verwenden,
child_process.exec(path, options, callback)
wenn Sie Async benötigen. Es gibt viel mehr Optionen als nur die Angabe des CWD, um Ihre Anforderungen weiter zu optimieren. Siehe exec / execSync- Dokumente.Bitte beachten Sie: In diesem Beispiel wird davon ausgegangen, dass Sie das Dienstprogramm zip auf Ihrem System installiert haben (zumindest mit OSX). Auf einigen Betriebssystemen ist möglicherweise kein Dienstprogramm installiert (dh die AWS Lambda-Laufzeit funktioniert nicht). In diesem Fall können Sie die Binärdatei des Zip-Dienstprogramms hier problemlos abrufen und zusammen mit Ihrem Anwendungsquellcode verpacken (für AWS Lambda können Sie sie auch in einer Lambda-Schicht verpacken), oder Sie müssen entweder ein Modul eines Drittanbieters verwenden (von denen es viele auf NPM gibt). Ich bevorzuge den früheren Ansatz, da sich das ZIP-Dienstprogramm seit Jahrzehnten bewährt hat.
quelle
zip
.Archive.bulk
ist jetzt veraltet, die neue Methode, die dafür verwendet werden soll, ist glob :quelle
So schließen Sie alle Dateien und Verzeichnisse ein:
Darunter wird Node-Glob ( https://github.com/isaacs/node-glob ) verwendet, sodass jeder damit kompatible übereinstimmende Ausdruck funktioniert.
quelle
Dies ist eine weitere Bibliothek, die den Ordner in einer Zeile komprimiert : zip-local
quelle
So leiten Sie das Ergebnis an das Antwortobjekt weiter (Szenarien, in denen die Zip-Datei heruntergeladen und nicht lokal gespeichert werden muss)
Sams Hinweise für den Zugriff auf den Inhalt des Verzeichnisses haben bei mir funktioniert.
quelle
Adm-zip hat Probleme beim Komprimieren eines vorhandenen Archivs https://github.com/cthackers/adm-zip/issues/64 sowie Beschädigungen beim Komprimieren von Binärdateien.
Ich habe auch Probleme mit der Komprimierungsbeschädigung mit Node-Zip https://github.com/daraosn/node-zip/issues/4 festgestellt
Der Node-Archiver ist der einzige, der gut zu komprimieren scheint, aber keine unkomprimierten Funktionen hat.
quelle
Ich habe diese kleine Bibliothek gefunden, die zusammenfasst, was Sie brauchen.
https://www.npmjs.com/package/zip-a-folder
quelle
Da
archiver
es lange Zeit nicht mit der neuen Version von Webpack kompatibel ist, empfehle ich die Verwendung von zip-lib .quelle
Sie können es auf einfache Weise versuchen:
Installieren
zip-dir
:und benutze es
quelle
Am Ende habe ich den Archivierer umwickelt, um JSZip zu emulieren, da das Refactoring durch mein Projekt zu viel Aufwand erfordert. Ich verstehe, dass Archiver vielleicht nicht die beste Wahl ist, aber los geht's.
quelle