2026-10-16 · 解法 · macOS
包管理器不认识
你的新系统时
命令能跑、能查包,但什么都装不上。原因是这个系统版本太新,官方还没有为它构建好的二进制包 ——于是安装全部退化成「现场编译」,然后卡在下载上。
这是换了新系统之后很容易撞上的一段:包管理器本身工作正常,但它手里没有你可以直接用的东西。 下面这套做法,是当天从「装不上」到「能用」的实际路径。
五秒判断:有没有现成的二进制包
以 Homebrew 为例,直接问它某个包有哪些预编译版本,看那个列表是不是空的:
brew info --json=v2 <包名> | python3 -c "import json,sys
d=json.load(sys.stdin)['formulae'][0]
print(list(d['bottles']['stable']['files']))"
输出是空列表([])就意味着:没有为你的系统准备好的二进制包,
接下来它会退化成源码编译。当天实测,随手查的三个常用包全是空的
——所以这不是某个包的问题,是整片都没有。
源码包通常托管在代码托管平台的下载地址上。这类地址在国内经常直连不到: 同一天实测,同一个下载地址直连 12 秒没有任何响应(超时), 而加持了镜像前缀之后 1.4 秒返回 200。
路线一:静态二进制,自己管
很多命令行工具提供「静态二进制」:单个文件,没有依赖,下载下来就能用。 做法是建一个自己的目录并加进 PATH(写在 shell 配置里,别去动系统目录):
mkdir -p ~/bin
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zprofile
# bash 用户把这行写进 ~/.bash_profile
curl -L -o ~/bin/工具名 <下载地址>
chmod +x ~/bin/工具名
这条路线最大的好处是:它跟你系统的版本无关。系统再新,一个静态二进制也照样跑。
路线二:给下载地址加镜像前缀
当源码包或发布资产直连不动时,在前面接一个镜像前缀即可(把完整地址原样接在前缀后面):
# 原地址(下载不动)
https://github.com/<用户>/<仓库>/releases/download/...
# 镜像前缀(当天实测可用)
https://gh-proxy.com/https://github.com/...
https://ghproxy.net/https://github.com/...
两个前缀都留着的理由是:都不保证长期稳定,一个不通用另一个。遇到下载卡住, 不要在一个前缀上反复重试,换一个更快。
最容易踩的那一脚:下载完了,一跑就死
在 Apple 芯片的机器上,从网上拿回来的二进制如果没有签名, 内核会直接把它杀掉,终端里只留下两个词:
$ ~/bin/某个工具 --version
Killed: 9
这个报错特别容易导错方向:看起来像权限问题(于是去查 chmod),
或者像架构不匹配(于是去查架构)。其实都不是——它只是没签名。
本地临时签一下就好:
codesign --force --sign - ~/bin/某个工具
这条命令不做公证、不验证来源,只是给文件补上一个本机认可的签名, 让内核允许它运行。所以它解决的是「让工具能跑」,不是「让工具可信」—— 来源该核实还是要核实。
判断成功的清单
| 步骤 | 真正的证据 |
|---|---|
| 下载完成 | 文件大小与发布页一致,而不是「命令结束了」 |
| 可以执行 | chmod +x 之后权限位确实带 x |
| 能跑起来 | 跑一次 --version,它真的报出版本号 |
| 在 PATH 里 | 新开一个终端窗口,直接敲工具名也能找到 |
第三条是最容易省掉、也最不该省的一步:「下载完成」和「能用」之间隔着一整条报错链
(签名、架构、动态库、PATH)。跑一次 --version,能同时验掉前面几项。
结论
新系统发布后的头几个月,包管理器往往是你工具箱里最不可靠的一层: 它自己没问题,但它依赖的东西还没跟上。
所以那段时间请准备一条不依赖它的路:一个自己的目录、几个静态二进制、一次本地签名。 这条路的成本是一个下午,换来的是——不管系统怎么升,你的工具都还在。
这篇属于「解法」:GitHub Pages 在国内网络下怎么发布 · 阿里邮箱免费版:让第三方客户端登进去。 相关连载:迁机实录 ① 搬什么。 回到笔记