3.2 keg-only 与链接机制
2 分钟阅读
原文链接: 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,运行:
| |
输出中会解释它为什么是 keg-only,并给出把它加入 PATH 的建议,一般形如:
| |
软件如何找到 keg-only 依赖
正常链接的依赖位于 Cellar 的 “rack” 中,目录形如 /opt/homebrew/Cellar/foo/1.0;而 keg-only 的依赖,构建系统通常应通过 opt prefix 引用:
| |
这是一个指向当前激活 keg 的符号链接,因此版本升级后路径仍然有效。构建软件时可以配置编译参数指向 /opt/homebrew/opt/foo,或查看 brew info 提示的 -I、-L 等编译参数。
强行链接的后果
如果确实需要,也可以强制链接:
| |
但这可能带来意外行为——尤其是当你用 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 中推荐的快速操作。