Bun.Archive 是 Bun 用于处理 tar 归档文件的原生 API。它可以根据内存中的数据创建归档文件,将归档文件解压到磁盘,并在不解压的情况下读取归档内容。
快速开始
从文件创建归档:创建归档
使用new Bun.Archive() 从一个对象创建归档,该对象的键是文件路径,值是文件内容。默认情况下,归档是不压缩的:
- 字符串 - 文本内容
- Blob - 二进制数据
- ArrayBufferView(例如
Uint8Array)- 原始字节 - ArrayBuffer - 原始二进制数据
写入归档到磁盘
使用Bun.write() 将归档写入磁盘:
获取归档字节数据
获取归档数据为字节或 Blob:解压归档
从现有归档数据创建
从现有的 tar/tar.gz 数据创建归档:解压到磁盘
使用.extract() 将所有文件写入目录:
extract() 会在目标目录不存在时创建该目录,并覆盖现有文件。返回的计数包括文件、目录和符号链接(在 POSIX 系统上)。
注意:在 Windows 上,无论权限级别如何,Bun 都会在解压时始终跳过符号链接。在 Linux 和 macOS 上,符号链接会正常解压。
安全提示:Bun.Archive 会在解压过程中验证路径。它会拒绝绝对路径(POSIX 的 /、类似 C:\ 或 C:/ 的 Windows 驱动器号,以及类似 \\server\share 的 UNC 路径)和不安全的符号链接目标。路径遍历组件(..)会被规范化移除,以防止目录逃逸攻击:dir/sub/../file 会变为 dir/file。
过滤解压的文件
使用 glob 模式仅解压特定文件。模式会与归档条目路径进行匹配,路径会被规范化为使用正斜杠(/)。正模式指定要包含的内容,负模式(以 ! 开头)指定要排除的内容。如果只提供负模式,则会包含所有不匹配这些模式的条目:
读取归档内容
获取所有文件
使用.files() 获取归档内容,返回由 File 对象组成的 Map,无需解压到磁盘。与会处理所有条目类型的 extract() 不同,files() 只返回普通文件(不包含目录):
File 对象包含:
name- 归档中的文件路径(始终使用正斜杠/作为分隔符)size- 文件大小,单位为字节lastModified- 修改时间戳- 标准
Blob方法,例如text()、arrayBuffer()和stream()
files() 会将文件内容加载到内存中。对于大型归档,请使用 extract() 直接写入磁盘。
错误处理
归档操作可能因数据损坏、I/O 错误或无效路径失败。使用 try/catch 处理这些情况:- 归档损坏/截断 -
new Archive()会加载归档数据;错误可能延迟到读取/解压时出现 - 权限不足 - 目标目录不可写时,
extract()会抛错 - 磁盘空间不足 - 空间不够时,
extract()会抛错 - 路径无效 - 路径格式错误时,操作会抛错
files() 会返回一个空的 Map:
使用 Glob 模式过滤
传入 glob 模式来筛选要返回的文件:*- 匹配除/之外的任意字符**- 匹配包括/在内的任意字符?- 匹配单个字符[abc]- 匹配字符集{a,b}- 匹配多个选项中的任意一个!pattern- 排除与模式匹配的文件(否定)。如果只提供否定模式,则会包含所有与这些模式不匹配的文件。
压缩
Bun.Archive 默认创建未压缩的 tar 归档。可通过{ compress: "gzip" } 启用 gzip 压缩:
options 参数接受:
- 不传或
undefined- 默认未压缩 tar { compress: "gzip" }- 启用 gzip 压缩,默认等级 6{ compress: "gzip", level: number }- gzip 压缩,自定义等级 1-12(1 为最快,12 为最小)。
示例
打包项目文件
解压并处理 npm 包
从目录创建归档
参考
注意:以下类型签名经过简化。完整的类型定义请参见 packages/bun-types/bun.d.ts。