菜单

包管理器

相关源文件

Bun 包含一个内置的包管理器,用于处理 JavaScript 依赖项的安装、更新和管理。本文档解释了 Bun 包管理器的架构和功能。有关如何作为最终用户使用包管理器,请参阅官方文档。

概述

Bun 的包管理器是 npm、yarn 和 pnpm 的快速、即插即用替代品。它直接集成到 Bun 运行时中,并提供与现有 Node.js 项目的兼容性,同时提供显著提高的性能。包管理器支持 npm 兼容的命令,如 installaddremove,并包含工作区、链接和锁定文件管理等功能。

来源

架构

包管理器由几个协同工作的关键组件构成,用于解析、下载和安装软件包。

来源

核心组件

PackageManager

结构体 PackageManager 是协调包安装过程的核心组件。它管理锁定文件、调度网络任务、处理安装任务以及构建 node_modules 目录结构。

主要职责

  • 解析和管理 package.json 依赖项
  • 通过各种来源解析依赖项
  • 从注册表中下载包
  • 提取包并构建 node_modules 结构
  • 管理锁定文件以跟踪依赖项

来源

Lockfile

结构体 Lockfile 管理已安装包及其依赖项的记录。Bun 支持二进制锁定文件格式 (bun.lockb),该格式针对性能进行了优化,以及一种文本格式 (bun.lock),该格式更易于人类阅读且对 Git 更友好。

主要功能

  • 用于更快安装的高效二进制序列化
  • 与其他锁定文件格式的兼容性(支持迁移)
  • 跟踪不同的依赖项类型(生产、开发等)
  • 支持工作区和提升的依赖项

来源

依赖项解析

依赖项解析是通过组合组件来处理的

  1. Dependency 代表一个具有以下特征的软件包依赖项:

    • 包名称
    • 版本规范
    • 依赖项行为(生产、开发、对等、可选)
  2. Resolution 代表具有特定版本信息的已解析依赖项

  3. 用于不同依赖项来源的各种解析器

    • NPM 注册表
    • Git 仓库
    • 本地文件夹
    • Tarballs
    • 工作区包

来源

网络处理

Bun 的包管理器通过以下方式实现高效的网络操作:

  1. 并发下载 - 可通过 --network-concurrency 进行配置
  2. 支持身份验证、代理和重定向的 HTTP 客户端
  3. 缓存包清单和 tarballs

来源

安装过程

包安装过程遵循以下主要步骤:

  1. 解析包文件
    • 读取 package.json 以获取依赖项
    • 检查现有的锁定文件
  2. 解析依赖项
    • 确定所需的包
    • 决定要安装的版本
  3. 下载包
    • 并发下载所需的包
    • 如果校验和可用,则验证完整性
  4. 提取并安装
    • 提取包内容
    • 链接二进制文件
    • 如有必要,执行安装脚本
  5. 更新锁定文件
    • 记录已安装的包
    • 保存依赖项树结构

来源

依赖项类型和解析

Bun 的包管理器支持各种依赖项类型:

依赖类型格式描述
npmpackage-name@version从注册表安装的标准 npm 包
gitgit://github.com/user/repo.gitGit 仓库 URL
githubuser/repo#commitishGitHub 简写格式
tarballhttps://example.com/pkg.tgzfile.tgz远程或本地 tarball
folderfile:./path/to/folder本地文件夹
workspaceworkspace:packages/name工作区包
symlink不适用符号链接的包(来自 bun link

依赖项解析遵循基于类型的特定规则:

  1. npm 包:使用 semver 查找最高匹配的版本
  2. git 仓库:克隆仓库并检出指定的 ref
  3. 本地文件夹:创建指向本地文件夹的符号链接
  4. tarballs:提取 tarball 内容
  5. 工作区:链接到工作区中的包

来源

Lockfile 系统

Bun 有两种锁定文件格式:

  1. 二进制锁定文件bun.lockb

    • 针对性能进行了优化
    • 不可读,也不利于 Git
    • 创建新项目时的默认格式
  2. 文本锁定文件bun.lock

    • 基于 JSON 的格式
    • 可读且对 Git 友好
    • 可通过配置启用

锁定文件存储:

  • 包信息(名称、版本、解析)
  • 包之间的依赖关系
  • Node 模块树结构
  • 用于安全验证的完整性哈希
  • 二进制链接

Bun 还可以从其他锁定文件格式迁移

来源

特殊功能

网络并发

Bun 允许通过 --network-concurrency 标志来配置并发网络请求的数量。默认是 64 个并发请求,可以根据网络状况或代理需求进行调整。

$ bun install --network-concurrency=10

来源

工作区支持

Bun 的包管理器支持基于工作区的 monorepos

  • 在根目录 package.json 中定义工作区
  • 将工作区包链接到 node_modules
  • 为所有工作区包安装依赖项
  • 使用 workspace: 协议引用其他工作区包

来源

二进制链接

包管理器会自动将包的二进制文件链接到 .bin 目录

  1. 解析 package.json 中的 bin 字段
  2. 在 node_modules/.bin 中创建可执行脚本
  3. 在 UNIX 系统上,为二进制文件设置正确的权限

来源

链接包

Bun 支持为本地开发链接包

$ bun link            # Register current package
$ bun link package    # Link a registered package into current project
$ bun unlink package  # Remove a linked package

这会在包之间创建符号链接,以便于本地开发。

来源

完整性检查

Bun 使用以下方式验证包的完整性

  • 存储在锁文件中的 SHA512 哈希
  • 提取过程中的验证
  • 支持 npm 兼容的完整性哈希

来源

命令和用法

Bun 的包管理器提供了一组与 npm 功能相似的命令

命令描述
bun install安装所有依赖项
bun add <pkg>添加依赖
bun remove <pkg>移除依赖
bun update [pkg]更新依赖
bun link [pkg]链接包以进行本地开发

其他标志包括

  • --production: 跳过开发依赖
  • --frozen-lockfile: 防止锁文件更新
  • --no-save: 安装时不更新 package.json
  • --network-concurrency=N: 设置最大网络请求数
  • --registry=URL: 使用自定义 npm 注册表

来源

性能考量

Bun 的包管理器注重性能

  1. 并行下载: 并发下载多个包
  2. 高效的锁文件: 二进制锁文件格式,解析速度更快
  3. 原生实现: 使用 Zig 编写,性能极高
  4. 内存效率: 为大型项目仔细进行内存管理
  5. 缓存: 有效缓存下载的包

默认情况下,Bun 使用 64 个并发网络请求,这在大多数情况下都能提供良好的性能。可以通过 --network-concurrency 标志进行调整。

来源