3.4 Tap 第三方仓库与信任模型

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

原文链接: https://docs.brew.sh/Tap-Trust

brew tap 是干什么的

brew tap 用于添加可供 Homebrew 使用的软件来源仓库,仓库中可以包含 formula、cask 和外部命令:

1
2
3
4
brew tap                 # 列出当前已添加的 tap
brew tap user/repository # 添加 GitHub 仓库
brew tap user/repository <URL>  # 从任意 Git URL 添加
brew untap user/repository      # 移除 tap

一个参数的形式默认假设仓库在 GitHub 上,并会克隆 https://github.com/<user>/homebrew-<repository>;两个参数的形式接受 Git 支持的任何 URL。

警告:tap 中的代码可以以你的用户权限运行。使用非官方 tap 前请先阅读本节关于信任模型的说明。

命名约定与同名冲突

GitHub 上要使用单参数形式,仓库必须命名为 homebrew-<repository>。命令中可以省略 homebrew- 前缀:

1
brew tap username/foobar

实际对应 https://github.com/username/homebrew-foobar。

当 tap 中的 formula 与 homebrew/core 同名时,需要写全限定名来指定来源:

1
2
brew install vim                    # 来自 homebrew/core
brew install username/repository/vim # 来自 username/repository,且信任该 formula

依赖 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 报警,需要加载它的命令则会失败,直到授予相应信任。

如何信任

安装全限定名只会信任那一个条目:

1
2
brew install user/repository/formula
brew install --cask user/repository/cask

想用短名称安装,先单独信任它:

1
2
3
brew tap user/repository
brew trust --formula user/repository/formula
brew install formula

也可以信任整个 tap:

1
2
brew trust user/repository
brew install formula

整个 tap 被信任后,Homebrew 可以加载其中当前及未来所有 formula、cask 和外部命令。官方建议:只信任你需要的那一个 formula/cask/命令;只有当你愿意接受该 tap 的全部现在与未来内容时,才信任整个 tap。

管理信任

1
2
3
4
brew trust                 # 列出已信任的条目
brew untrust               # 列出未信任的 tap、formula、cask、命令
brew untrust user/repository                # 取消信任整个 tap
brew untrust --formula user/repository/formula

环境变量说明

HOMEBREW_REQUIRE_TAP_TRUST=1 与 HOMEBREW_NO_REQUIRE_TAP_TRUST=1 均已弃用。不要通过环境变量关闭信任机制;需要什么就 brew trust 什么。

实践建议

  1. 优先安装官方仓库的软件;
  2. 必须使用第三方 tap 时,先看 tap 的仓库活跃度、维护者与源码;
  3. 安装时使用全限定名,或在 Brewfile 中声明式信任(见 6.3 进阶 Brewfile 写法)。