6.2 用 brew bundle 管理机器状态

原文链接: https://docs.brew.sh/Brew-Bundle-and-Brewfile

快照当前机器:brew bundle dump

brew bundle dump 会把当前已安装的 formula、cask、tap 及其他受支持类型导出成一个 Brewfile。把输出写到全局位置:

1
brew bundle dump --global --force

默认写入 ~/.Brewfile(具体路径见 man brew)。生成的 Brewfile 默认还会在每个软件上方添加描述注释,例如:

1
2
# 功能强大、简洁、面向对象的脚本语言
brew "ruby"

恢复(并默认升级)这些软件:

1
brew bundle --global

多份快照与差异比较

不同 Brewfile 通过 --file 指定:

1
2
brew bundle dump --file=~/backups/Brewfile-2026-09-09
brew bundle --file=~/backups/Brewfile-2026-09-09

快照可以提交进版本控制,用普通 diff 工具比较不同时间点的机器状态。

让机器严格匹配快照:brew bundle cleanup

先安装目标 Brewfile,再把清单之外的受支持软件全部卸载:

1
brew bundle cleanup --force --file=/path/to/Brewfile

不带 --force 时会先询问确认。cleanup 同时会把 Homebrew 的全局信任库重置为所选 Brewfile 声明的值:未在文件中声明的信任项会被移除。

查询 Brewfile:list

1
2
3
brew bundle list            # 列出 Brewfile 中的 formula
brew bundle list --cask     # 列出其中的 cask
brew bundle list --all      # 列出所有类型

编辑:edit

在编辑器中打开当前目录的 Brewfile:

1
brew bundle edit

增删条目:add / remove

1
2
brew bundle add wget
brew bundle remove wget

remove 可用 --formula、--cask、--tap 等参数限定只删除某类条目。

版本与锁文件的真相

Homebrew 是滚动发布(rolling release)包管理器,官方明确表示:

brew bundle 不会、也不打算提供类似 package-lock.json 或 Gemfile.lock 的 “Brewfile 锁文件”。

想停止自动升级,使用:

1
brew bundle --no-upgrade

或设置 HOMEBREW_BUNDLE_NO_UPGRADE=1。之后仍可手动整体升级:

1
brew bundle upgrade

或只升级部分 formula:

1
brew bundle --upgrade-formulae ruby

若需要真正的“锁定特定版本”,参见官方 Locking installed formulae at specific versions,并在 4.2 更新、升级与版本固定 中了解 brew pin。