Homebrew 使用详解

配图源自 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 由以下几部分组成。

名称 说明
brew Homebrew 源代码仓库
homebrew-core Homebrew Core 仓库
homebrew-cask Homebrew Cask 仓库,提供 macOS 应用和大型二进制文件的安装
homebrew-bottles Homebrew 预编译二进制软件包与软件包元数据文件
homebrew-cask-versions Homebrew 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容