3.2 keg-only 与链接机制

原文链接: https://docs.brew.sh/FAQ

keg-only 是什么意思

前文提过,brew 通常会把 keg 里的文件符号链接到 prefix(例如把 /opt/homebrew/Cellar/foo/1.0/bin/foo 链接为 /opt/homebrew/bin/foo),这样工具才能被直接调用。

“keg-only”表示某个 formula 只安装进 Cellar,不会被链接进默认 prefix。常见原因是该软件与 macOS 系统自带版本同名或同库,链接后可能造成冲突。典型的例子是 openssl:系统已经自带旧版 OpenSSL 库,brew 的 openssl 若强行链接,可能破坏依赖系统库的软件。

如何查看 keg-only 原因

对每个 keg-only formula,运行:

1
brew info <formula>

输出中会解释它为什么是 keg-only,并给出把它加入 PATH 的建议,一般形如:

1
export PATH="/opt/homebrew/opt/openssl/bin:$PATH"

软件如何找到 keg-only 依赖

正常链接的依赖位于 Cellar 的 “rack” 中,目录形如 /opt/homebrew/Cellar/foo/1.0;而 keg-only 的依赖,构建系统通常应通过 opt prefix 引用:

1
/opt/homebrew/opt/foo

这是一个指向当前激活 keg 的符号链接,因此版本升级后路径仍然有效。构建软件时可以配置编译参数指向 /opt/homebrew/opt/foo,或查看 brew info 提示的 -I、-L 等编译参数。

强行链接的后果

如果确实需要,也可以强制链接:

1
brew link <formula>

但这可能带来意外行为——尤其是当你用 brew 的库“遮蔽”了 macOS 自带的同名软件时。Homebrew 不推荐随意这么做,强行链接 keg-only 软件通常还会让 brew doctor 报警。更安全的做法是在项目级编译配置里引用 opt 路径。

与卸载相关的行为

卸载普通 formula 会移除它的符号链接与 keg。卸载 keg-only formula 则只删除 Cellar 里的 keg。如果之前手动 brew link 过,建议先 brew unlink <formula> 再卸载。

提示:想让某个已链接的包暂时从 prefix “消失”,不必卸载,执行 brew unlink <formula>;之后可用 brew link <formula> 恢复。这也是官方 Tips 中推荐的快速操作。