homebrew

Homebrew

Homebrew安装的程序默认路径:
自动链接 :大多数软件安装后会自动在 /opt/homebrew/bin/
原始文件 :实际程序存放在 /opt/homebrew/Cellar///

你观察到的 /opt/homebrew/opt/opt/homebrew/bin 目录结构确实是 Homebrew 的核心设计模式,虽然看起来有点绕,但这是为了版本管理和多版本共存而精心设计的。我来解释它的逻辑和优势:


  1. 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

存放可执行文件的符号链接,指向 Cellaropt 中的真实文件。例如:

python3 -> ../opt/python@3.13/bin/python3

  1. 为什么这样设计?
    优势 1:多版本共存
    • 在 Cellar 中,同一个软件的不同版本可以并存(例如 python@3.12python@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),无需关心具体版本号。


  1. 看似复杂,实则高效
    虽然符号链接增加了理解成本,但这种设计解决了以下问题:
    • 避免污染系统目录(Homebrew 完全独立于 macOS 系统自带的 /usr/bin)。

• 支持回滚(通过切换 opt 的链接可以快速恢复到旧版本)。

• 减少冲突(不同软件包的依赖可以指向各自需要的版本)。


  1. 类比其他工具
    类似的设计也出现在其他包管理器中:
    • Linux 的 alternatives(如 update-alternatives --config python)。

• Node.js 的 nvm(通过符号链接切换 Node 版本)。

• Ruby 的 rbenv


  1. 如何查看实际路径?
    如果好奇符号链接的最终指向,可以用:
# 查看 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 是什么?

  1. Formula(公式)
    定义:一个 Ruby 脚本文件(.rb),描述了“如何安装一个软件”。
    类比:就像“菜谱”——告诉你这道菜需要哪些食材(依赖)、怎么洗菜、怎么炒、火候多大。
    内容包括:
    软件名称、版本
    下载地址(源码包)
    编译步骤(configure, make, make install)
    依赖项(比如 postgresql 依赖 openssl)
    存放位置:
    text
    编辑
    /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/postgresql.rb
    ✅ Formula 是“安装说明书”。

  2. 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"

posted @ 2025-10-02 22:14  RolandHe  阅读(34)  评论(0)    收藏  举报