homebrew
Homebrew
Homebrew安装的程序默认路径:
自动链接 :大多数软件安装后会自动在 /opt/homebrew/bin/
原始文件 :实际程序存放在 /opt/homebrew/Cellar/
你观察到的 /opt/homebrew/opt 和 /opt/homebrew/bin 目录结构确实是 Homebrew 的核心设计模式,虽然看起来有点绕,但这是为了版本管理和多版本共存而精心设计的。我来解释它的逻辑和优势:
- Homebrew 的目录结构设计
Homebrew 的核心目录有三个:
•/opt/homebrew/Cellar
实际安装位置,所有软件包的真实文件都存放在这里,按 软件名@版本/版本号 的子目录存放(例如 python@3.13/3.13.3)。
• /opt/homebrew/opt
存放符号链接,每个链接指向 Cellar 中某个软件包的当前激活版本。例如:
python@3.13 -> ../Cellar/python@3.13/3.13.3
这样设计后,其他程序可以通过固定的路径 /opt/homebrew/opt/python@3.13 访问 Python,而无需关心具体版本号。
• /opt/homebrew/bin
存放可执行文件的符号链接,指向 Cellar 或 opt 中的真实文件。例如:
python3 -> ../opt/python@3.13/bin/python3
- 为什么这样设计?
✅ 优势 1:多版本共存
• 在Cellar中,同一个软件的不同版本可以并存(例如python@3.12和python@3.13),但通过opt中的链接动态切换当前激活版本。
• 切换版本只需更改 opt 中的链接目标,无需移动或重装文件。
✅ 优势 2:依赖管理
• 如果软件 A 依赖 python@3.12,而软件 B 依赖 python@3.13,Homebrew 可以通过调整 opt 中的链接满足不同依赖需求。
✅ 优势 3:干净卸载
• 卸载软件时,只需删除 Cellar 中的对应目录和 opt/bin 中的链接,不会残留文件。
✅ 优势 4:一致性路径
• 用户或脚本只需记住固定路径(如 /opt/homebrew/opt/python@3.13),无需关心具体版本号。
- 看似复杂,实则高效
虽然符号链接增加了理解成本,但这种设计解决了以下问题:
• 避免污染系统目录(Homebrew 完全独立于 macOS 系统自带的/usr/bin)。
• 支持回滚(通过切换 opt 的链接可以快速恢复到旧版本)。
• 减少冲突(不同软件包的依赖可以指向各自需要的版本)。
- 类比其他工具
类似的设计也出现在其他包管理器中:
• Linux 的alternatives(如update-alternatives --config python)。
• Node.js 的 nvm(通过符号链接切换 Node 版本)。
• Ruby 的 rbenv。
- 如何查看实际路径?
如果好奇符号链接的最终指向,可以用:
# 查看 opt 中的链接指向
ls -l /opt/homebrew/opt
# 查看 bin 中的可执行文件最终位置
realpath $(which python3)
总结
Homebrew 的 Cellar/opt/bin 结构不是过度设计,而是经过验证的、可靠的版本管理方案。虽然初次接触可能觉得绕,但熟悉后会发现它的灵活性和可维护性极强。
当使用brew install —cask 安装图形界面的应用时,即便homebrew设置了国内镜像,但也会从应用官网下载安装包。 这时,clash verge设置的代理会起作用。如果没起作用,就在终端里执行下设置环境变量。
export ALL_PROXY="http://127.0.0.1:7897"
export http_proxy="http://127.0.0.1:7897"
export https_proxy="http://127.0.0.1:7897"
常用命令:
brew list: 列出已安装的软件
brew tap: 列出额外填加的软件库(除默认的核心仓库homebrew/core外)
homebrew安装包管理机制
🧩 一、Formula 和 Bottle 是什么?
-
Formula(公式)
定义:一个 Ruby 脚本文件(.rb),描述了“如何安装一个软件”。
类比:就像“菜谱”——告诉你这道菜需要哪些食材(依赖)、怎么洗菜、怎么炒、火候多大。
内容包括:
软件名称、版本
下载地址(源码包)
编译步骤(configure, make, make install)
依赖项(比如 postgresql 依赖 openssl)
存放位置:
text
编辑
/opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/postgresql.rb
✅ Formula 是“安装说明书”。 -
Bottle(预编译包)
定义:一个已经编译好的二进制压缩包(.tar.gz),可以直接解压使用。
类比:你不用自己炒菜,而是直接从外卖平台点一份已经做好的菜。
作用:避免在你的电脑上从源码编译,节省时间。
命名:
text
编辑
postgresql-17.5.arm64_big_sur.bottle.tar.gz
包含:软件名、版本、系统架构、macOS 版本。
✅ Bottle 是“预装好的软件包”。
🔁 安装流程对比
方式 流程 耗时 何时使用
brew install(有 bottle) 下载 bottle → 解压 → 安装 几秒 大多数情况
brew install --build-from-source 下载源码 → 编译 → 安装 几分钟 没有 bottle 或强制编译
Formula在homebrew目录里是一个git仓库。 这个仓库只存储一些软件的概要信息,而不是真下的安装包。
cd $(brew --repo) 通过这个命令切换到homebrew目录后,再使用 git remote -v 可以查看这个仓库的远端库地址,默认为 https://github.com/Homebrew/brew
brew update命令就是更新这个Formula仓库,相当于执行了git pull或者git fetch命令,以便将最新的软件信息更新到本地。
brew install 软件名 会在本地Formula仓库找到该软件对应的最新的稳定版本,然后去到向bottle服务器请求下载这个版本的安装包。
brew search 软件名 用于查找某个软件都有哪些版本。
brew info 软件名 用于查看软件具体信息,包括版本,来源,依赖,以及如何启动等。 一般在实际安装之前运行一下这个命令,就知道你将会实际安装哪个版本。
bottle服务器可以用HOMEBREW_BOTTLE_DOMAIN环境变量进行配置。
HOMEBREW_API_DOMAIN环境变量决定brew search命令请求的http服务器。
当这两个环境变量都未设置时,homebrew通过Formula远端库的地址进行推断。
还有个环境变量HOMEBREW_PIP_INDEX_URL,它影响安装python第三方包时使用的PYPI地址。 它并不影响我们手动使用pip命令或uv命令安装第三方包,而是当我们使用brew install安装某个软件,但该软件就依赖python的某个第三方包时,它在内部会执行pip install命令将这个三方包安装到软件需要的一个路径下。
为了保持环境一致,建议如果想设置镜像,就只设置Formula仓库的git remote地址,HOMEBREW_BOTTLE_DOMAIN和HOMEBREW_API_DOMAIN不设置,但会自动由Formula地址推断得出。 但HOMEBREW_PIP_INDEX_URL地址并不能由Formula地址推断得出,所以如果想设置镜像,就得单独设置这个环境变量。
如果就是要设置这两个环境变量,那么也要确保一致,不要一个设置清华的,一个设置阿里的。 否则可能会产生brew search查到的信息,和bottle服务器上实际存在的内容不一致。
当不设置HOMEBREW_API_DOMAIN时,brew search默认会从推断的http服务器进行查询,如果存在网络问题,则转而向本地Formula仓库进行查询。
我目前的环境配置就很有问题。
git remote -v 显示
origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew (fetch)
origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew (push)
cat ~/.zprofile 显示
export HOMEBREW_PIP_INDEX_URL=http://mirrors.aliyun.com/pypi/simple #ckbrew
export HOMEBREW_API_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles/api #ckbrew
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles #ckbrew
eval $(/opt/homebrew/bin/brew shellenv) #ckbrew
新版的homebrew通过设置HOMEBREW_API_DOMAIN,可以从服务器上直接查看软件信息,而不再通过brew update先更新本地Formula仓库,再从本地仓库进行查找。
直接使用brew install命令时,内部应该也会通过HOMEBREW_API_DOMAIN查找,再去bottle服务器下载安装包并安装。
清华镜像的这两个参数配置如下:
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"

浙公网安备 33010602011771号