Archiver https://www.npmjs.com/package/archiver uses Readdir-Glob https://www.npmjs.com/package/readdir-glob对于通配符使用小型比赛 https://www.npmjs.com/package/minimatch匹配。
中的匹配Readdir-Glob https://www.npmjs.com/package/readdir-glob (node-readdir-glob/index.js#L147 https://github.com/Yqnn/node-readdir-glob/blob/master/index.js#L147)是针对包括路径名的完整文件名完成的,它不允许我们应用该选项matchBase https://www.npmjs.com/package/minimatch#matchbase这只是完整路径的基本名称。
为了让它发挥作用,你有两个选择:
1. 使你的 glob 排除文件扩展名
您可以使用 glob 否定转换您的 glob 表达式以排除您不希望出现在存档文件中的所有文件扩展名!(...)
它将包括除与否定表达式匹配的内容之外的所有内容:
zip.glob(
'**/!(*.jpg|*.png|*.webp|*.bmp)',
{
cwd: 'user_uploads',
},
{}
);
2. Make 小型比赛 https://www.npmjs.com/package/minimatch使用完整文件路径名
To make 小型比赛 https://www.npmjs.com/package/minimatch在我们无法设置的情况下工作matchBase https://www.npmjs.com/package/minimatch#matchbase选项,我们必须包含匹配的目录 glob 才能使其工作:
zip.glob(
'**/*',
{
cwd: 'user_uploads',
ignore: ['**/*.jpg', '**/*.png', '**/*.webp', '**/*.bmp'],
},
{}
);
行为
这种行为的Readdir-Glob https://www.npmjs.com/package/readdir-glob有点令人困惑ignore
option:
Options https://www.npmjs.com/package/readdir-glob#options
ignore
:用于排除匹配的 Glob 模式或 Glob 模式数组。如果文件或文件夹至少与所提供的模式之一匹配,则不会返回。它不会阻止返回文件夹内容中的文件。
这意味着igrore
items 必须是实际的全局表达式必须包含整个路径/文件表达式。当我们指定*.jpg
,它将匹配文件仅在根目录中 and 不是子目录。如果我们想排除目录树深处的 JPG 文件,我们必须使用包括所有目录模式加上文件扩展名模式是**/*.jpg
.
仅排除子目录中的内容
如果您只想排除特定子目录中的某些文件扩展名,可以使用如下否定模式将子目录添加到路径中:
// The glob pattern '**/!(Subdir)/*.jpg' will exclude all JPG files,
// that are inside any 'Subdir/' subdirectory.
zip.glob(
'**/*',
{
cwd: 'user_uploads',
ignore: ['**/!(Subdir)/*.jpg'],
},
{}
);