Skip to main content
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 /、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() 会抛出异常
  • 无效路径 - 对于格式错误的文件路径,操作会抛出异常
对于不可信归档的额外安全性,你可以在提取前枚举和验证路径:
当使用 glob 模式调用时,如果没有匹配的文件,files() 会返回空的 Map

使用 Glob 模式过滤

传递 glob 模式以过滤返回哪些文件:
支持的 glob 模式(Bun.Glob 语法的子集):
  • * - 匹配除 / 以外的任意字符
  • ** - 匹配包括 / 在内的任意字符
  • ? - 匹配单个字符
  • [abc] - 匹配字符集合
  • {a,b} - 匹配备选方案
  • !pattern - 排除匹配模式的文件(否定)。当只提供否定模式时,所有不匹配它们的文件都会被包含。
完整的 glob 语法(包括转义和高级模式),请参见 Bun.Glob

压缩

默认情况下,Bun.Archive 创建未压缩的 tar 归档。使用 { compress: "gzip" } 启用 gzip 压缩:
options 参数接受:
  • 无选项或 undefined - 未压缩的 tar(默认)
  • { compress: "gzip" } - 在级别 6 启用 gzip 压缩
  • { compress: "gzip", level: number } - 使用自定义级别 1-12 的 gzip(1 = 最快,12 = 最小)

示例

打包项目文件

提取并处理 npm 包

从目录创建归档

参考

注意:以下类型签名已简化。完整的类型定义请参见 packages/bun-types/bun.d.ts