Bun

Patch 依赖项

bun patch 允许你以可维护、git 友好的方式持久地 patch node_modules。

有时,你需要对 node_modules/ 中的包进行小的更改,以修复错误或添加功能。 bun patch 使你可以轻松地做到这一点,而无需 vendor 整个包,并在多次安装、多个项目和多台机器上重复使用 patch。

功能特点

  • 生成 .patch 文件,应用于安装时 node_modules 中的依赖项
  • .patch 文件可以提交到你的仓库,在多次安装、项目和机器之间重复使用
  • package.json 中的 "patchedDependencies" 跟踪已 patch 的包
  • bun patch 允许你 patch node_modules/ 中的包,同时保持 Bun 全局缓存 的完整性
  • 在提交更改之前,使用 bun patch --commit <pkg> 在本地测试你的更改
  • 为了节省磁盘空间并保持 bun install 的快速性,patched 的包会提交到全局缓存,并在可能的情况下在项目之间共享

步骤 1. 准备要 patch 的包

要开始使用,请使用 bun patch <pkg> 准备要 patch 的包

# you can supply the package name
bun patch react

# ...and a precise version in case multiple versions are installed
bun patch react@17.0.2

# or the path to the package
bun patch node_modules/react

注意 — 不要忘记调用 bun patch <pkg>! 这确保了 node_modules/ 中的包文件夹包含该包的全新副本,没有指向 Bun 缓存的符号链接/硬链接。

如果你忘记这样做,你最终可能会在缓存中全局编辑该包!

步骤 2. 在本地测试你的更改

bun patch <pkg> 使您可以安全地直接编辑 node_modules/ 中的 <pkg>,同时保持 Bun 全局缓存 的完整性。其工作原理是在 node_modules/ 中重新创建一个未链接的软件包克隆,并将其与全局缓存中的原始软件包进行比较。

步骤 3. 提交您的更改

当您对更改感到满意后,运行 bun patch --commit <path or pkg>

Bun 将在 patches/ 中生成一个补丁文件,更新您的 package.json 和 lockfile,并且 Bun 将开始使用已修补的软件包

# you can supply the path to the patched package
bun patch --commit node_modules/react

# ... or the package name and optionally the version
bun patch --commit react@17.0.2

# choose the directory to store the patch files
bun patch --commit react --patches-dir=mypatches

# `patch-commit` is available for compatibility with pnpm
bun patch-commit react

CLI 用法

$bun patch <package>@<version> flags or options

标志 (Flags)

配置 (Configuration)

-c,--config=<val>
指定配置文件路径 (bunfig.toml)
--registry=<val>
默认使用特定的注册表,覆盖 .npmrc、bunfig.toml 和环境变量

依赖管理 (Dependency Management)

-y,--yarn
写入 yarn.lock 文件 (yarn v1)
-p,--production
不安装 devDependencies
--no-save
不更新 package.json 或保存 lockfile
--save
保存到 package.json (默认 true)
--omit=<val>
从安装中排除 'dev'、'optional' 或 'peer' 依赖

Lockfile 管理 (Lockfile Management)

--frozen-lockfile
不允许更改 lockfile
--save-text-lockfile
保存基于文本的 lockfile
--lockfile-only
生成 lockfile 而不安装依赖

安装行为 (Installation Behavior)

-f,--force
始终从注册表请求最新版本 & 重新安装所有依赖
--dry-run
不安装任何内容
--ignore-scripts
跳过项目 package.json 中的生命周期脚本 (永远不会运行依赖脚本)
--trust
添加到项目 package.json 中的 trustedDependencies 并安装软件包

缓存和性能 (Caching and Performance)

--cache-dir=<val>
从特定目录路径存储和加载缓存数据
--no-cache
完全忽略 manifest 缓存
--concurrent-scripts=<val>
生命周期脚本的最大并发作业数 (默认为 5)
--network-concurrency=<val>
最大并发网络请求数 (默认为 48)
--backend=<val>
安装依赖项的平台特定优化。可能的值:"clonefile" (默认), "hardlink", "symlink", "copyfile"

日志和输出 (Logging and Output)

--silent
不记录任何内容
--verbose
过度详细的日志记录
--no-progress
禁用进度条
--no-summary
不打印摘要

安全和验证 (Security and Verification)

--ca=<val>
提供证书颁发机构签名证书
--cafile=<val>
与 `--ca` 相同,但它是证书的文件路径
--no-verify
跳过验证新下载软件包的完整性

实用工具 (Utility)

-g,--global
全局安装
--cwd=<val>
设置特定的 cwd
-h,--help
打印此帮助菜单

补丁 (Patching)

--commit
安装包含 `dir` 中修改的软件包
--patches-dir=<val>
用于存放补丁文件的目录 (仅当使用 --commit 时)

示例 (Examples)