Skip to content

fix(macos): Homebrew 6 第三方 tap 信任门 —— 文档补 brew trust,fresh-install 加 brew 验证段 - #420

Merged
Sunrisepeak merged 1 commit into
mainfrom
fix/macos-brew-untrusted-tap
Aug 11, 2026
Merged

fix(macos): Homebrew 6 第三方 tap 信任门 —— 文档补 brew trust,fresh-install 加 brew 验证段#420
Sunrisepeak merged 1 commit into
mainfrom
fix/macos-brew-untrusted-tap

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

报错

Refusing to load formula mcpp-community/mcpp/mcpp-m from untrusted tap
mcpp-community/mcpp.

为什么一直没被发现

Homebrew 6 拒绝从未信任的第三方 tap 加载公式,但
brew install <user>/<repo>/<formula> 是豁免的 —— 它被读作显式意图。
README 文档化的正是这条全限定命令,所以它一直是绿的,而用户真正会敲的
其它每一种拼写都是坏的。

真机实测(macOS 14.8.7 / 15.7.7 / 26.5.2,Homebrew 6.0.5 / 6.0.12 / 6.0.13,
临时探针 PR #419):

命令 rc
brew install mcpp-community/mcpp/mcpp-m(未 tap / 已 tap) 0 / 0
brew install mcpp-m(短名) 1
brew install mcpp-community/mcpp/mcpp(alias) 1
brew trust mcpp-community/mcpp 0
trust 后:短名 / alias / upgrade / new+run 全 0

alias 本身没坏:报错里点名的是它解析到的 mcpp-m,被拒的是信任

改动

  • README.md / README.zh-CN.md:安装段写清信任门与 brew trust 一行修法
  • ci-fresh-install.yml 新增 macos-brew-fresh job

为什么是独立 job 而不是加进 macos-fresh

那个 job 已经有一份经 xlings 装的 mcpp 在 PATH 上,再 brew 装一份会让下面每
一条断言都说不清自己量的是哪个二进制。

它也不需要 wait-index:brew 直接装 GitHub release tarball,而 tap 的
bump 工作流比 release 晚几分钟 —— 在这里断言"刚发布的版本"会因为与 mcpp 无关
的原因变 flaky。版本断言改成自洽的:tapped 公式声明什么版本,装出来的二进制
就必须报什么版本。

这个 job 从两侧钉住信任门

只断言"trust 后短名能用"是不够的 —— 那分不清"门被正确处理了"和"这个
Homebrew 根本没有门",而一个不可能失败的测试与没在跑的测试无从区分。所以先
断言未信任时被拒、且拒绝理由确实是 untrusted tap(不是别的新缺陷),再断言
trust 之后短名/alias/upgrade 全通。将来 Homebrew 撤掉这道门,这一步会变红并说明
原因,而不是继续假装在保护什么。

另加两条只有真实用户会碰到的判据:装完能 mcpp new + mcpp run 真跑起来
(过 launcher 的 MCPP_HOME/MCPP_VENDORED_XLINGS 钉法与工具链自举),以及
per-user 状态确实落在 ~/.mcpp 而不是 Cellar(否则 brew upgrade 会把用户装
的工具链一起带走)。

tap 侧同步:mcpp-community/homebrew-mcpp@e5bdc21(README 那句
"short forms work too" 与 alias 宣传都已改准,公式 caveats 补了 brew trust)。


诊断过程见临时探针 PR #419(合入本 PR 后关闭)。三轮探针 run:
31515906050(macos-14 全绿,排除"公式坏了")、
31516199954(OS/arch/tap-path 矩阵,定位 untrusted tap)、
31517553279(从两侧验证 brew trust 确实修好每条路径)。

⚠️ 探针 round 1 踩了个坑值得记:mcpp new … | tail -20 后取 $? 拿到的是
tail 的退出码,把失败读成了成功。round 2 起所有退出码都在管道之前捕获。

…brew 验证段

## 报错

    Refusing to load formula mcpp-community/mcpp/mcpp-m from untrusted tap
    mcpp-community/mcpp.

## 为什么一直没被发现

Homebrew 6 拒绝从未信任的第三方 tap 加载公式,但
`brew install <user>/<repo>/<formula>` 是豁免的 —— 它被读作显式意图。
README 文档化的正是这条全限定命令,**所以它一直是绿的**,而用户真正会敲的
其它每一种拼写都是坏的。

真机实测(macOS 14.8.7 / 15.7.7 / 26.5.2,Homebrew 6.0.5 / 6.0.12 / 6.0.13,
临时探针 PR #419):

| 命令 | rc |
|---|---|
| `brew install mcpp-community/mcpp/mcpp-m`(未 tap / 已 tap) | 0 / 0 |
| `brew install mcpp-m`(短名) | **1** |
| `brew install mcpp-community/mcpp/mcpp`(alias) | **1** |
| `brew trust mcpp-community/mcpp` | 0 |
| trust 后:短名 / alias / upgrade / new+run | 全 0 |

alias 本身没坏:报错里点名的是它解析到的 `mcpp-m`,被拒的是**信任**。

## 改动

- README.md / README.zh-CN.md:安装段写清信任门与 `brew trust` 一行修法
- ci-fresh-install.yml 新增 `macos-brew-fresh` job

## 为什么是独立 job 而不是加进 macos-fresh

那个 job 已经有一份经 xlings 装的 mcpp 在 PATH 上,再 brew 装一份会让下面每
一条断言都说不清自己量的是哪个二进制。

它也**不需要 `wait-index`**:brew 直接装 GitHub release tarball,而 tap 的
bump 工作流比 release 晚几分钟 —— 在这里断言"刚发布的版本"会因为与 mcpp 无关
的原因变 flaky。版本断言改成**自洽**的:tapped 公式声明什么版本,装出来的二进制
就必须报什么版本。

## 这个 job 从两侧钉住信任门

只断言"trust 后短名能用"是不够的 —— 那分不清"门被正确处理了"和"这个
Homebrew 根本没有门",而一个不可能失败的测试与没在跑的测试无从区分。所以先
断言**未信任时被拒、且拒绝理由确实是 untrusted tap**(不是别的新缺陷),再断言
trust 之后短名/alias/upgrade 全通。将来 Homebrew 撤掉这道门,这一步会变红并说明
原因,而不是继续假装在保护什么。

另加两条只有真实用户会碰到的判据:装完能 `mcpp new` + `mcpp run` 真跑起来
(过 launcher 的 MCPP_HOME/MCPP_VENDORED_XLINGS 钉法与工具链自举),以及
per-user 状态确实落在 ~/.mcpp 而不是 Cellar(否则 `brew upgrade` 会把用户装
的工具链一起带走)。

tap 侧同步:mcpp-community/homebrew-mcpp@e5bdc21(README 那句
"short forms work too" 与 alias 宣传都已改准,公式 caveats 补了 brew trust)。
@Sunrisepeak
Sunrisepeak merged commit 8219584 into main Aug 11, 2026
31 checks passed
@Sunrisepeak
Sunrisepeak deleted the fix/macos-brew-untrusted-tap branch August 11, 2026 17:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants