Saya perlu membuat zip seluruh direktori menggunakan Node.js. Saat ini saya menggunakan node-zip dan setiap kali proses berjalan, itu menghasilkan file ZIP yang tidak valid (seperti yang Anda lihat dari masalah Github ini ).
Apakah ada opsi Node.js lain yang lebih baik yang memungkinkan saya untuk ZIP direktori?
EDIT: Saya akhirnya menggunakan Pengarsip
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);
};
nilai sampel untuk parameter:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
UPDATE: Bagi mereka yang bertanya tentang implementasi yang saya gunakan, berikut ini tautan ke pengunduh saya :
zip
perintah unix menyertakan semua hierarki folder induk dari direktori kerja saat ini dalam file zip. Ini mungkin baik untuk Anda, itu bukan untuk saya. Juga mengubah direktori kerja saat ini di child_process tidak mempengaruhi hasil. 2) Untuk mengatasi masalah ini, Anda harus menggunakanpushd
untuk melompat ke folder yang akan Anda zip danzip -r
, tetapi karenapushd
dibangun ke dalam bash dan bukan / bin / sh Anda perlu menggunakan / bin / bash juga. Dalam kasus khusus saya ini tidak mungkin. Hanya satu kepala.child_process.exec
memungkinkan Anda menentukan cwd dari mana Anda ingin menjalankan perintah. Mengubah CWD memperbaiki masalah hierarki folder induk. Ini juga memperbaiki masalah tidak perlupushd
. Saya sangat merekomendasikan child_process.Jawaban:
Saya akhirnya menggunakan lib pengarsipan . Bekerja dengan baik.
Contoh
sumber
.bulk
tidak digunakan lagiSaya tidak berpura-pura menunjukkan sesuatu yang baru, hanya ingin merangkum solusi di atas untuk mereka yang suka menggunakan fungsi Promise dalam kodenya (seperti saya).
Semoga itu akan membantu seseorang;)
sumber
Gunakan
child_process
api asli Node untuk melakukannya.Tidak perlu libs pihak ketiga. Dua baris kode.
Saya menggunakan API sinkron. Anda dapat menggunakan
child_process.exec(path, options, callback)
jika Anda membutuhkan async. Ada lebih banyak pilihan selain hanya menentukan CWD untuk lebih menyempurnakan permintaan Anda. Lihat dokumen exec / execSync .Harap diperhatikan: Contoh ini mengasumsikan Anda telah menginstal utilitas zip di sistem Anda (setidaknya dilengkapi dengan OSX). Beberapa sistem operasi mungkin belum menginstal utilitas (yaitu, waktu proses AWS Lambda tidak). Dalam hal ini, Anda dapat dengan mudah mendapatkan biner utilitas zip di sini dan mengemasnya bersama dengan kode sumber aplikasi Anda (untuk AWS Lambda, Anda juga dapat mengemasnya dalam Lapisan Lambda), atau Anda harus menggunakan modul pihak ketiga (ada banyak tentang NPM). Saya lebih suka pendekatan sebelumnya, karena utilitas ZIP telah dicoba dan diuji selama beberapa dekade.
sumber
zip
.Archive.bulk
sekarang tidak digunakan lagi, metode baru yang akan digunakan untuk ini adalah glob :sumber
Untuk memasukkan semua file dan direktori:
Ini menggunakan node-glob ( https://github.com/isaacs/node-glob ) di bawahnya, sehingga ekspresi apa pun yang cocok dengan itu akan berfungsi.
sumber
Ini adalah pustaka lain yang mem-zip folder dalam satu baris: zip-local
sumber
Untuk menyalurkan hasil ke objek respons (skenario di mana ada kebutuhan untuk mengunduh zip daripada menyimpan secara lokal)
Petunjuk Sam untuk mengakses konten direktori berhasil untuk saya.
sumber
Adm-zip mengalami masalah hanya dengan mengompresi arsip yang ada https://github.com/cthackers/adm-zip/issues/64 serta kerusakan dengan mengompresi file biner.
Saya juga mengalami masalah korupsi kompresi dengan node-zip https://github.com/daraosn/node-zip/issues/4
node-archiver adalah satu-satunya yang tampaknya berfungsi dengan baik untuk dikompresi tetapi tidak memiliki fungsionalitas yang tidak dikompresi.
sumber
Saya telah menemukan perpustakaan kecil ini yang merangkum apa yang Anda butuhkan.
https://www.npmjs.com/package/zip-a-folder
sumber
Karena
archiver
tidak kompatibel dengan versi baru webpack untuk waktu yang lama, saya sarankan menggunakan zip-lib .sumber
Anda dapat mencoba dengan cara yang sederhana:
Pasang
zip-dir
:dan gunakan itu
sumber
Saya akhirnya membungkus pengarsip untuk meniru JSZip, karena refactoring melalui proyek saya akan membutuhkan terlalu banyak usaha. Saya mengerti Archiver mungkin bukan pilihan terbaik, tapi ini dia.
sumber