使用Node.js的Archiver压缩目录时如何递归排除指定文件和目录
解决方案
你遇到的问题是glob忽略规则的写法导致的:默认不带前缀的匹配规则只会匹配cwd根目录下的对应文件/目录,要实现全层级递归排除,需要在规则前加**/前缀。同时你现有代码还有几处错误需要修正:
- 规则里的
mode_modules拼写错误,少了字母n,导致排除node_modules的规则完全不生效 - 输出流的参数是目录
__dirname,运行会报错,需要指定具体的zip文件路径 - glob匹配模式
*/**会漏掉根目录下的直接文件,改成**/*才能匹配所有层级的文件和目录
修正后的完整代码如下:
const fs = require('fs'); const archiver = require('archiver'); // 指定具体的输出压缩包路径 const output = fs.createWriteStream(__dirname + '/output.zip'); const archive = archiver('zip', { zlib: { level: 9 } }); archive.pipe(output); archive.glob('**/*', { cwd: __dirname, // 加**/前缀实现任意层级的递归匹配 ignore: ['**/node_modules', '**/ignored-file-name', '*.zip'] }); archive.finalize();
规则说明
**/是glob语法的通配符,代表匹配任意深度的子目录- 如果需要排除所有层级下特定后缀的文件,可以写成
**/*.后缀名,例如**/*.log就会排除所有目录下的log文件 - 如果仅需要排除特定层级的文件,可以写明确的路径规则,例如
sub-folder/*.txt只会排除sub-folder目录下的txt文件,不会影响其他目录的同名文件
内容的提问来源于stack exchange,提问作者passionateLearner
相关产品推荐
相关产品推荐

