Bun.Archive 提供了一个快速的原生实现来处理 tar 归档。它支持从内存数据创建归档,将归档解压到磁盘,以及在不解压的情况下读取归档内容。
快速开始
从文件创建归档:创建归档
使用new Bun.Archive() 从对象创建归档,其中键是文件路径,值是文件内容。默认情况下,归档是未压缩的:
- 字符串 - 文本内容
- Blobs - 二进制数据
- ArrayBufferViews (例如
Uint8Array) - 原始字节 - ArrayBuffers - 原始二进制数据
将归档写入磁盘
使用Bun.write() 将归档写入磁盘:
获取归档字节
将归档数据获取为字节或 Blob:解压归档
从现有归档数据
从现有的 tar/tar.gz 数据创建归档:解压到磁盘
使用.extract() 将所有文件写入目录:
/,Windows 驱动器字母如 C:\ 或 C:/,以及 UNC 路径如 \\server\share)。路径遍历组件(..)会被标准化(例如,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()会抛出异常 - 无效路径 - 对于格式错误的文件路径,操作会抛出异常
extract() 返回的计数包括所有成功写入的条目(文件、目录和 POSIX 系统上的符号链接)。
安全说明: Bun.Archive 在解压期间自动验证路径。绝对路径(POSIX 的 /,Windows 驱动器字母,UNC 路径)和不安全的符号链接目标会被拒绝。路径遍历组件(..)会被标准化以防止目录遍历。
对于不受信任的归档,您可以枚举并在解压前验证路径:
files() 时,如果没有文件匹配,则返回空的 Map:
使用 Glob 模式过滤
传递 glob 模式来过滤返回的文件:*- 匹配除/以外的任何字符**- 匹配包括/在内的任何字符?- 匹配单个字符[abc]- 匹配字符集{a,b}- 匹配替代项!pattern- 排除匹配的文件(否定)。必须与正模式结合使用;仅使用负模式不会匹配任何内容。
压缩
Bun.Archive 默认创建未压缩的 tar 归档。使用{ compress: "gzip" } 启用 gzip 压缩:
- 无选项或
undefined- 未压缩的 tar(默认) { compress: "gzip" }- 启用 gzip 压缩,级别为 6{ compress: "gzip", level: number }- 使用自定义级别 1-12 的 Gzip(1 = 最快,12 = 最小)
示例
打包项目文件
解压并处理 npm 包
从目录创建归档
参考
注意: 为了文档目的,以下类型签名已简化。完整的类型定义请参见 packages/bun-types/bun.d.ts。