Muszę spakować cały katalog za pomocą Node.js. Obecnie używam node-zip i za każdym razem, gdy proces jest uruchamiany, generuje nieprawidłowy plik ZIP (jak widać z tego problemu na Github ).
Czy jest inna, lepsza opcja Node.js, która pozwoli mi spakować katalog?
EDYCJA: Skończyło się na używaniu archiwizatora
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);
};
przykładowa wartość parametrów:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
AKTUALIZACJA: Dla tych, którzy pytają o implementację, której użyłem, oto link do mojego downloadera :
zip
polecenie unix zawiera całą hierarchię folderów nadrzędnych bieżącego katalogu roboczego w spakowanym pliku. To może być dla ciebie w porządku, to nie dla mnie. Również zmiana bieżącego katalogu roboczego w child_process w jakiś sposób nie wpływa na wyniki. 2) Aby rozwiązać ten problem, musisz użyć,pushd
aby wskoczyć do folderu, który chcesz spakowaćzip -r
, ale ponieważpushd
jest wbudowany w bash, a nie / bin / sh, musisz również użyć / bin / bash. W moim przypadku nie było to możliwe. Tylko jedno ostrzeżenie.child_process.exec
API węzła @johnozbay pozwala określić cwd, z którego chcesz uruchomić polecenie. Zmiana CWD rozwiązuje problem hierarchii folderów nadrzędnych. Rozwiązuje również problem braku potrzebypushd
. W pełni polecam child_process.Odpowiedzi:
Skończyło się na używaniu archiwizatora lib. Działa świetnie.
Przykład
źródło
.bulk
jest przestarzałyNie udaję, że pokazuję coś nowego, po prostu chcę podsumować powyższe rozwiązania dla tych, którzy lubią używać funkcji Promise w swoim kodzie (jak ja).
Mam nadzieję, że to komuś pomoże;)
źródło
child_process
Aby to osiągnąć, użyj natywnego interfejsu API Node .Nie ma potrzeby korzystania z bibliotek innych firm. Dwie linie kodu.
Używam synchronicznego interfejsu API. Możesz użyć,
child_process.exec(path, options, callback)
jeśli potrzebujesz asynchronicznego. Istnieje znacznie więcej opcji niż tylko określenie CWD, aby jeszcze bardziej dopracować swoje żądania. Zobacz dokumentację exec / execSync .Uwaga: w tym przykładzie założono, że w systemie jest zainstalowane narzędzie zip (przynajmniej jest dostarczane z systemem OSX). Niektóre systemy operacyjne mogą nie mieć zainstalowanego narzędzia (np. Środowisko uruchomieniowe AWS Lambda nie). W takim przypadku możesz łatwo pobrać plik binarny narzędzia zip tutaj i spakować go wraz z kodem źródłowym aplikacji (w przypadku AWS Lambda możesz również spakować go w Lambda Layer) lub będziesz musiał użyć modułu innej firmy (których na NPM jest mnóstwo). Wolę to pierwsze podejście, ponieważ narzędzie ZIP jest wypróbowywane i testowane od dziesięcioleci.
źródło
zip
.Archive.bulk
jest teraz przestarzała, nową metodą, która ma być używana, jest glob :źródło
Aby uwzględnić wszystkie pliki i katalogi:
Używa pod spodem node-glob ( https://github.com/isaacs/node-glob ), więc każde pasujące wyrażenie będzie działać.
źródło
To jest kolejna biblioteka, która zamyka folder w jednym wierszu: zip-local
źródło
Aby przesłać wynik do obiektu odpowiedzi (scenariusze, w których istnieje potrzeba pobrania pliku zip zamiast przechowywania lokalnie)
Podpowiedzi Sama dotyczące dostępu do zawartości katalogu zadziałały w moim przypadku.
źródło
Adm-zip ma problemy z samą kompresją istniejącego archiwum https://github.com/cthackers/adm-zip/issues/64, a także z uszkodzeniem podczas kompresji plików binarnych.
Napotkałem również problemy z uszkodzeniem kompresji w przypadku node-zip https://github.com/daraosn/node-zip/issues/4
node-archiver jest jedynym, który wydaje się dobrze działać w kompresji, ale nie ma żadnych funkcji dekompresowania.
źródło
Znalazłem tę małą bibliotekę, która zawiera to, czego potrzebujesz.
https://www.npmjs.com/package/zip-a-folder
źródło
Ponieważ
archiver
nie jest kompatybilny z nową wersją webpacka przez długi czas, polecam użycie zip-lib .źródło
Możesz spróbować w prosty sposób:
Zainstaluj
zip-dir
:i użyj go
źródło
Skończyło się na tym, że owijałem archiwizator, aby emulować JSZip, ponieważ refaktoryzacja mojego projektu wymagałaby zbyt dużego wysiłku. Rozumiem, że Archiver może nie być najlepszym wyborem, ale proszę bardzo.
źródło