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()会抛出异常 - 无效路径 - 对于格式错误的文件路径,操作会抛出异常
files() 会返回空的 Map:
使用 Glob 模式过滤
传递 glob 模式以过滤返回哪些文件:*- 匹配除/以外的任意字符**- 匹配包括/在内的任意字符?- 匹配单个字符[abc]- 匹配字符集合{a,b}- 匹配备选方案!pattern- 排除匹配模式的文件(否定)。当只提供否定模式时,所有不匹配它们的文件都会被包含。
压缩
默认情况下,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。