Мне нужно заархивировать весь каталог с помощью Node.js. В настоящее время я использую node-zip, и каждый раз, когда процесс запускается, он генерирует недопустимый ZIP-файл (как вы можете видеть из этой проблемы Github ).
Есть ли другой, лучший вариант Node.js, который позволит мне заархивировать каталог?
РЕДАКТИРОВАТЬ: в итоге я использовал архиватор
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);
};
примерное значение для параметров:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
ОБНОВЛЕНИЕ: для тех, кто интересуется реализацией, которую я использовал, вот ссылка на мой загрузчик :
zip
команда unix включает всю иерархию родительских папок текущего рабочего каталога в заархивированный файл. Это может быть нормально для тебя, это не для меня. Также изменение текущего рабочего каталога в child_process каким-то образом не влияет на результаты. 2) Чтобы решить эту проблему, вы должны использоватьpushd
для перехода в папку, которую вы заархивируетеzip -r
, но посколькуpushd
она встроена в bash, а не в / bin / sh, вам также необходимо использовать / bin / bash. В моем конкретном случае это было невозможно. Просто предупреждаю.child_process.exec
позволяет вам указать cwd, откуда вы хотите запустить команду. Изменение CWD устраняет проблему иерархии родительских папок. Это также решает проблему отсутствия необходимостиpushd
. Я полностью рекомендую child_process.Ответы:
В итоге я использовал архиватор lib. Прекрасно работает.
пример
источник
.bulk
устарелоЯ не претендую на то, чтобы показывать что-то новое, просто хочу обобщить приведенные выше решения для тех, кто любит использовать функции Promise в своем коде (например, я).
Надеюсь, это кому-то поможет;)
источник
Для этого используйте собственный
child_process
API Node .Нет необходимости в сторонних библиотеках. Две строчки кода.
Я использую синхронный API. Вы можете использовать,
child_process.exec(path, options, callback)
если вам нужен async. Есть гораздо больше вариантов, чем просто указать CWD для дальнейшей настройки ваших запросов. См. Документацию по exec / execSync .Обратите внимание: в этом примере предполагается, что в вашей системе установлена утилита zip (по крайней мере, она поставляется с OSX). В некоторых операционных системах утилита может не быть установлена (например, в среде выполнения AWS Lambda). В этом случае вы можете легко получить здесь двоичный файл утилиты zip и упаковать его вместе с исходным кодом приложения (для AWS Lambda вы также можете упаковать его в Lambda Layer), либо вам придется либо использовать сторонний модуль. (которых много на NPM). Я предпочитаю первый подход, так как утилита ZIP проверена десятилетиями.
источник
zip
.Archive.bulk
устарел, для этого будет использоваться новый метод glob :источник
Чтобы включить все файлы и каталоги:
Он использует node-glob ( https://github.com/isaacs/node-glob ) внизу, поэтому любое подходящее выражение, совместимое с этим, будет работать.
источник
Это еще одна библиотека, которая архивирует папку в одну строку: zip-local
источник
Чтобы передать результат в объект ответа (сценарии, в которых необходимо загрузить zip-архив, а не хранить его локально)
Подсказки Сэма для доступа к содержимому каталога у меня сработали.
источник
У Adm-zip есть проблемы с просто сжатием существующего архива https://github.com/cthackers/adm-zip/issues/64, а также с повреждением при сжатии двоичных файлов.
Я также столкнулся с проблемами повреждения сжатия с помощью node -zip https://github.com/daraosn/node-zip/issues/4
node-archiver - единственный, который, кажется, хорошо работает для сжатия, но не имеет функции распаковки.
источник
Я нашел эту небольшую библиотеку, которая инкапсулирует все, что вам нужно.
https://www.npmjs.com/package/zip-a-folder
источник
Поскольку
archiver
он давно не совместим с новой версией webpack, рекомендую использовать zip-lib .источник
Можно попробовать простым способом:
Установить
zip-dir
:и использовать это
источник
Я закончил тем, что упаковал архиватор для эмуляции JSZip, так как рефакторинг моего проекта потребует слишком много усилий. Я понимаю, что Archiver может быть не лучшим выбором, но вот и все.
источник