3.4 Tap 第三方仓库与信任模型
3 分钟阅读
brew tap 是干什么的
brew tap 用于添加可供 Homebrew 使用的软件来源仓库,仓库中可以包含 formula、cask 和外部命令:
| |
一个参数的形式默认假设仓库在 GitHub 上,并会克隆 https://github.com/<user>/homebrew-<repository>;两个参数的形式接受 Git 支持的任何 URL。
警告:tap 中的代码可以以你的用户权限运行。使用非官方 tap 前请先阅读本节关于信任模型的说明。
命名约定与同名冲突
GitHub 上要使用单参数形式,仓库必须命名为 homebrew-<repository>。命令中可以省略 homebrew- 前缀:
| |
实际对应 https://github.com/username/homebrew-foobar。
当 tap 中的 formula 与 homebrew/core 同名时,需要写全限定名来指定来源:
| |
依赖 homebrew/core formula 的包,不能用其他 tap 中的同名 formula 替换其依赖。
为什么需要“tap 信任”
formula、cask 和外部命令本质上是可执行代码,不是普通元数据。Homebrew 有时需要执行 tap 中的 Ruby 代码来解析依赖、发现软件包或运行命令。因此,从 Homebrew 6.0.0 起,官方之外的 tap 默认都要求显式信任。
信任模型带来几个实际收益:
- 减少 Homebrew 默认评估的非官方代码量;
- 降低 tap 仓库被攻破、仓库所有权变更、包名冲突、或仅因 tap 存在而加载其命令带来的影响;
- 让脚本可以只信任它们打算使用的 tap、formula、cask 或命令。
官方 Homebrew tap 与 Homebrew 内置命令始终受信任;未受信任的非官方 tap 会导致 brew doctor 报警,需要加载它的命令则会失败,直到授予相应信任。
如何信任
安装全限定名只会信任那一个条目:
| |
想用短名称安装,先单独信任它:
| |
也可以信任整个 tap:
| |
整个 tap 被信任后,Homebrew 可以加载其中当前及未来所有 formula、cask 和外部命令。官方建议:只信任你需要的那一个 formula/cask/命令;只有当你愿意接受该 tap 的全部现在与未来内容时,才信任整个 tap。
管理信任
| |
环境变量说明
HOMEBREW_REQUIRE_TAP_TRUST=1 与 HOMEBREW_NO_REQUIRE_TAP_TRUST=1 均已弃用。不要通过环境变量关闭信任机制;需要什么就 brew trust 什么。
实践建议
- 优先安装官方仓库的软件;
- 必须使用第三方 tap 时,先看 tap 的仓库活跃度、维护者与源码;
- 安装时使用全限定名,或在
Brewfile中声明式信任(见 6.3 进阶 Brewfile 写法)。