Homebrew 使用详解

822 阅读4分钟

配图源自 Freepik

原文链接

Homebrew 是什么?

Homebrew 是 macOS 和 Linux 上非常流行的开源包管理器,可以理解为一个命令行版本的应用商店。它是相对安全的,如果你知道自己正在下载什么。起码目前 Homebrew 上不存在恶意包(All Formulae)。

Homebrew complements macOS (or your Linux system).

术语

讲真的,Homebrew 术语有点羞涩难懂,本身有自制酿酒之意,诸如 Formula、Cask 等也是与酿酒相关的。

术语意译说明
Formula配方表示安装包的描述文件。复数为 formulae。
Cask木桶装酒的器具,表示具有 GUI 界面的原生应用。
Keg小桶表示某个包某个版本的安装目录,比如 /usr/local/Cellar/foo/0.1
Cellar地窖存放酒的地方,表示包的安装目录,比如 /usr/local/Cellar
Caskroom木桶间表示类型为 Cask 的包的安装目录,比如:/usr/local/Caskroom
Tap水龙头表示包的来源,也就是镜像源。
Bottle瓶子表示预先编译好的包,下载好直接使用。

Related Link: Homebrew Terminology, Simplifying Homebrew terminology.

组成

Homebrew 由以下几部分组成。

名称说明
brewHomebrew 源代码仓库
homebrew-coreHomebrew Core 仓库
homebrew-caskHomebrew Cask 仓库,提供 macOS 应用和大型二进制文件的安装
homebrew-bottlesHomebrew 预编译二进制软件包与软件包元数据文件
homebrew-cask-versionsHomebrew Cask 其他版本 (alternative versions) 软件仓库,提供使用人数多的、需要的版本不在 Cask 仓库中的应用。
homebrew-services与 brew services 有关的文件,用于在 macOS (launchctl) 与 Linux (systemctl) 上管理 brew 安装的服务。

Homebrew 安装

本文以 macOS 为例。

复制以下命令,粘贴到「终端」应用回车执行,等待完成即可。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

如果没有 🪜 下载很慢的话,可以使用国内的安装脚本。

$ /bin/bash -c "$(curl -fsSL https://mirrors.ustc.edu.cn/misc/brew-install.sh)"

如果此前没有安装过 Xcode Command Line Tools,上述过程会提示安装,按回车耐心等待安装完成。

Related link: macOS Requirements.

==> The Xcode Command Line Tools will be installed.

Press RETURN/ENTER to continue or any other key to abort:

也可先自行安装 Xcode Command Line Tools,再安装 Homebrew。

$ xcode-select --install

完成后可使用 brew -v 命令,若有输出版本号,表示已安装成功,可忽略以下环境变量配置步骤。

$ brew -v
Homebrew 4.1.22
Homebrew/homebrew-core (git revision a58688396f3; last commit 2023-12-02)

如果出现如下问题,则需要配置环境变量。

$ brew -v
brew:command not found

执行 which $SHELL 确认你的 macOS 的默认 Shell 是哪个?

$ which $SHELL
/bin/zsh

通常是 zshbash,对应的配置文件为 ~/.zshrc~/.bash_profile

从 macOS Catalina 开始,Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell,详见

下文以 zsh 为例,如果你使用其他 Shell,涉及到 .zshrc 请自行调整为你的配置文件名称。

# 添加环境变量至 .zshrc
$ echo 'export PATH="/usr/local/bin:/usr/local/sbin:/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"' >> ~/.zshrc

# 刷新环境变量
$ source ~/.zshrc

完了之后,再执行 brew -v 应该就能正常输出版本号了。

Homebrew 升级指南

如果首次安装,可忽略本节内容。

自 4.0 起,有一些变化:

  • 默认使用从 Formulae.brew.sh 下载的 JSON 文件进行包的安装,而不是本地 homebrew/corehomebrew/cask 源。可以考虑使用 brew untap homebrew/corebrew untap homebrew/cask 来节省一些空间(除非你正在开发包)。

  • 可以考虑将 HOMEBREW_NO_INSTALL_FROM_API 移除(如果设置过)。

  • 可以考虑将 HOMEBREW_API_DOMAIN 设为指定镜像源(如果使用新的安装方式)。

  • 自动运行 brew update 的频率由 5min 改为 24h。可以重新考虑是否需要设置 HOMEBREW_NO_AUTO_UPDATEHOMEBREW_AUTO_UPDATE_SECS 了(如果设置过)。

如果想安装了 4.0 及更新版本,又想沿用以前的安装方式,可以设置环境变量:

$ echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc

如果你使用 3.3.0 ~ 3.6.0 之间的版本,想要使用全新的 JSON API 来安装包,可以设置环境变量:

$ echo 'export HOMEBREW_INSTALL_FROM_API=1' >> ~/.zshrc

自 4.0 起为默认行为,无需设置。

Related Link:

Homebrew 源切换

安装后,如果使用 brew installbrew upgradebrew update 较慢,可以考虑切换为国内的镜像源,比如:

以 USTC 镜像源为例。

如果使用 4.x 最新的 JSON API 安装方式(推荐),添加以下环境变量配置:

$ echo '
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/bottles"
' >> ~/.zshrc

如果使用 4.0 之前版本,或者使用 4.x 但又想用此前的安装方式,添加以下环境变量配置:

$ echo '
export HOMEBREW_NO_INSTALL_FROM_API=1
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/bottles"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_CASK_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-cask.git"
'>> ~/.zshrc

若要重置为官方镜像源,移除以上环境变量即可。

另外,如不希望 Homebrew 收集匿名数据,可以通过设置环境变量关闭:

$ echo 'export HOMEBREW_NO_ANALYTICS=1' >> ~/.zshrc

Related Link: Anonymous Analytics.

Homebrew 自动更新

默认情况下,在执行 brew installbrew upgradebrew tap 之前,每隔第一段时间会自动执行 brew update 以获取最新的 Homebrew 版本。

在 4.0 起自动执行频率为 24h,如果开启了 HOMEBREW_NO_INSTALL_FROM_API=1 频率为 5min。可通过以下环境变量完全禁用、设置时间间隔。

$ echo '
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_AUTO_UPDATE_SECS=86400
' >> ~/.zshrc

这就是每次安装/更新包时,先出现 Downloading https://formulae.brew.sh/api/formula.jws.json 的原因。这个 JSON 文件有 4M 多,如果加上默认的镜像源,不慢才怪。

Homebrew 相关路径

相关命令

# 显示 Homebrew 本地的 Git 仓库
$ brew --repo

# 显示 Homebrew 安装路径
$ brew --prefix

# 显示 Homebrew Cellar 路径
$ brew --cellar

# 显示 Homebrew Caskroom 路径
$ brew --caskroom

# 缓存路径
$ brew --cache

Homebrew 默认安装路径如下:

  • macOS ARM: /opt/homebrew
  • macOS Intel: /usr/local

Related Link: Discussion: longterm Homebrew prefix on Apple Silicon Macs

brew install git 为例:

  1. Homebrew 将 git 下载至 /usr/local/Cellar/git/<version>/ 目录下,其二进制文件在 /usr/local/Cellar/git/<version>/bin/git

  2. Homebrew 为 /usr/local/Cellar/git/<version>/bin/git 创建了一个软链文件至 /usr/local/bin 里。

macOS ARM 的路径对应是:

  • /opt/homebrew/Cellar/git/<version>/
  • /opt/homebrew/Cellar/git/<version>/bin/git
  • /opt/homebrew/bin

这也是 macOS ARM 要将 /opt/homebrew/bin 添加到 PATH 环境变量的原因。

当执行 brew uninstall 时,会将 /usr/local/Cellar 下对应包目录删除,对应的链接关系也会移除。 当执行 brew cleanup 时,会将 /usr/local/Cellar 所有包里的旧版本,只保留最新版本。

Homebrew Cask 的区别

可以简单地将 Homebrew 的包分为命令行工具、GUI 应用两类。

$ brew install <package-name>    # 安装
$ brew uninstall <package-name>  # 卸载
$ brew reinstall <package-name>  # 重装

如安装的是 GUI 应用,加上 --cask 参数。比如 brew install docker --cask

如需强制卸载,加上 --force 参数。

使用 brew search 命令可以看到「Formulae」和「Casks」两类:

  • Formulae:一般是那些命令行工具、开发库、字体、插件等不含 GUI 界面的软件。
  • Casks:是指那些含有 GUI 图形化界面的软件,比如 Chrome、FireFox 等。
$ brew search google

==> Formulae
aws-google-auth                          google-sparsehash
google-authenticator-libpam              google-sql-tool
google-benchmark                         googler
google-go                                googletest
google-java-format

==> Casks
google-ads-editor
google-analytics-opt-out
google-backup-and-sync
...

Related Link: Homebrew Cask

Homebrew 常用命令

检查

用于检查 Homebrew 当前配置是否合理,或者某些包存在的问题等。

$ brew doctor

搜索

支持模糊搜索。

$ brew search <keyword>

更新包

$ brew upgrade                  # 更新所有已安装的包
$ brew upgrade <package-name>   # 更新指定包

列出已安装的包

$ brew list                     # 所有的软件,包括 Formulae  和 Cask
$ brew list --formulae          # 所有已安装的 Formulae
$ brew list --cask              # 所有已安装的 Casks
$ brew list <package-name>      # 列举某个 Formulate 或 Cask 的详细路径

列出可更新的包

$ brew outdated

锁定某个不想更新的包

$ brew pin <package-name>       # 锁定指定包
$ brew unpin <package-name>     # 取消锁定指定包

清理旧包

$ brew cleanup                  # 清理所有旧版本的包
$ brew cleanup <package-name>   # 清理指定的旧版本包
$ brew cleanup -n               # 查看可清理的旧版本包

查看已安装包的依赖

$ brew deps --installed --tree

查看包的信息

$ brew info <package>           # 显示某个包信息
$ brew info                     # 显示安装的软件数量、文件数量以及占用空间

References