Preciso compactar um diretório inteiro usando Node.js. No momento, estou usando o node-zip e cada vez que o processo é executado, ele gera um arquivo ZIP inválido (como você pode ver neste problema no Github ).
Existe outra opção melhor do Node.js que me permitirá compactar um diretório?
EDIT: Acabei usando arquivador
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 amostra para parâmetros:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
ATUALIZAÇÃO: para quem pergunta sobre a implementação que usei, aqui está um link para meu downloader :
zip
comando unix inclui toda a hierarquia de pasta pai do diretório de trabalho atual no arquivo compactado. Isso pode ser bom para você, não era para mim. Além disso, alterar o diretório de trabalho atual em child_process de alguma forma não afeta os resultados. 2) Para superar este problema, você deve usar opushd
para pular para a pasta que irá compactar ezip -r
, mas comopushd
está embutido no bash e não no / bin / sh, você precisa usar / bin / bash também. No meu caso específico, isso não foi possível. Apenas um aviso.child_process.exec
API do nó @johnozbay permite que você especifique o cwd de onde deseja executar o comando. Alterar o CWD corrige o problema da hierarquia da pasta pai. Ele também corrige o problema de não precisarpushd
. Eu recomendo totalmente child_process.Respostas:
Acabei usando o archiver lib. Funciona bem.
Exemplo
fonte
.bulk
está obsoletoNão pretendo mostrar algo novo, só quero resumir as soluções acima para quem gosta de usar funções do Promise em seu código (como eu).
Espero que ajude alguém;)
fonte
Use a
child_process
API nativa do Node para fazer isso.Não há necessidade de bibliotecas de terceiros. Duas linhas de código.
Estou usando a API síncrona. Você pode usar
child_process.exec(path, options, callback)
se precisar assíncrono. Existem muito mais opções do que apenas especificar o CWD para ajustar ainda mais suas solicitações. Veja a documentação exec / execSync .Observação: este exemplo assume que você tem o utilitário zip instalado em seu sistema (ele vem com o OSX, pelo menos). Alguns sistemas operacionais podem não ter o utilitário instalado (ou seja, o tempo de execução do AWS Lambda não tem). Nesse caso, você pode obter facilmente o binário do utilitário zip aqui e empacotá-lo junto com o código-fonte do seu aplicativo (para AWS Lambda, você pode empacotá-lo em uma camada Lambda também) ou terá que usar um módulo de terceiros (dos quais há muitos no NPM). Eu prefiro a abordagem anterior, já que o utilitário ZIP é testado e aprovado há décadas.
fonte
zip
.Archive.bulk
agora está obsoleto, o novo método a ser usado para isso é glob :fonte
Para incluir todos os arquivos e diretórios:
Ele usa node-glob ( https://github.com/isaacs/node-glob ) embaixo, então qualquer expressão compatível com isso funcionará.
fonte
Esta é outra biblioteca que compacta a pasta em uma linha: zip-local
fonte
Para canalizar o resultado para o objeto de resposta (cenários em que é necessário fazer o download do zip em vez de armazená-lo localmente)
As dicas de Sam para acessar o conteúdo do diretório funcionaram para mim.
fonte
O Adm-zip tem problemas apenas para compactar um arquivo existente https://github.com/cthackers/adm-zip/issues/64 , bem como corrupção com a compactação de arquivos binários.
Também tive problemas de corrupção de compressão com node-zip https://github.com/daraosn/node-zip/issues/4
node-archiver é o único que parece funcionar bem para compactar, mas não tem nenhuma funcionalidade de descompactação.
fonte
Encontrei esta pequena biblioteca que contém o que você precisa.
https://www.npmjs.com/package/zip-a-folder
fonte
Como
archiver
não é compatível com a nova versão do webpack há muito tempo, recomendo o uso do zip-lib .fonte
Você pode tentar de uma maneira simples:
Instale
zip-dir
:e usá-lo
fonte
Acabei envolvendo o arquivador para emular JSZip, pois a refatoração por meio do meu projeto exigiria muito esforço. Eu entendo que Archiver pode não ser a melhor escolha, mas aqui está.
fonte