MacOS软件包管理器--brew
摘要
-
brew是一个软件包管理器,同时支持MacOS和Linux,可以很方便地安装各种软件,比如
git、node、python等。 -
brew虽然支持linux,但是实际使用中很少会使用brew来管理linux的软件包。 -
本文介绍如何在macos下安装brew,以及如何使用brew管理各种软件包。
-
本文基于 MacOS Intel Ventura 13.7.1,brew 版本为4.4.8。
安装
-
首先要确保系统中安装了
git和curl,对于 macOS 用户来说,这些系统都自带了,唯一需额外要求安装的是Command Line Tools (CLT) for Xcode。
1 | # 检查系统中是否安装了 Command Line Tools (CLT) for Xcode |
在MacOS上安装brew的方法
方法一:使用脚本安装
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
-
安装时可以指定镜像下载源,默认是Homebrew的GitHub下载源,也可以选择国内的镜像源,比如使用清华大学的Homebrew镜像源
1 | # 控制了 Homebrew 在安装软件包时是否从 Homebrew 的 API 服务器获取信息,brew4.0+ 是默认行为,无需设置 |
方法二:使用PKG文件安装
方法三:国内无法访问github地址时可以使用国内镜像源
-
这里依旧以清华大学的Homebrew镜像源为例
1 | # 设置brew仓库上游 |
验证是否安装成功
-
brew命令本身及通过brew安装的所有命令都会被软链接到/usr/local/bin/下,所以需要将该路径加入系统环境PATH中 -
重启终端,然后执行
brew -v命令查看brew的版本,如果安装成功,会输出类似如下内容
1 | $ brew -v |
-
Homebrew本身的安装位置可以通过
brew --repo查看,默认为/usr/local/Homebrew -
通过brew安装的软件包默认会被安装到
/usr/local/Cellar/下,比如git安装后会在/usr/local/Cellar/git/目录下,可以通过brew info git查看安装信息,包括依赖库等。
1 | # 显示 Homebrew 安装路径,macOS ARM: /opt/homebrew,macOS Intel: /usr/local |
配置命令补全
-
我这里使用的是
zsh,在~/.zshrc中加入如下内容并重启终端即可生效
1 | autoload -Uz compinit |
卸载brew
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" |
常用命令
-
Homebrew 使用
formula来构建和安装软件包(常见于命令行工具和库),使用cask来安装已打包的 macOS 应用程序(通常为图形界面软件)。brew install xxx安装命令行工具,这个最为常用,比如brew install fdbrew install --cask xxx安装应用(一般很少使用,更推荐官网下载安装),比如brew install --cask firefox
用 Homebrew 管理「命令行工具」,用官网管理「应用软件」。
-
brew的命令和参数非常多,但日常使用只需要记住常用的几个就够了,详细的命令列表可以参考Homebrew Documentation
1 | # 查看brew支持哪些命令 |
一些常用的命令
1 | brew update # 更新brew到最新版本 |
-
查看已安装的包
1 | # 查看 |
-
搜索
1 | # 查找 |
-
安装、卸载
1 | brew install xxx # 安装软件包,此命令相当于加上了 --formula ,安装时会自动下载依赖库,比如安装`nginx`时,会自动下载`openssl@3`和`pcre2`等 |
-
升级
1 | # 升级 |
-
依赖关系
1 | # 依赖关系 |
-
仓库管理,参考资料Homebrew Documentation–Taps
1 | # 仓库管理 |
-
brew services: brew的服务管理工具,可以方便的管理通过brew安装的服务,包括启动、停止、重启服务,等等,比如nginx、redis、mysql等,具体命令可以参考Homebrew Documentation
1 | # 第一次执行 services 相关的命令时会自动下载 homebrew/services,也可以 通过 brew tap homebrew/services 提前下载 |
brew 安装流程
-
更新brew到最新版本:
HOMEBREW_BREW_GIT_REMOTE -
Homebrew 先看有没有对应 Bottle(与你的系统/架构匹配)
-
如果有 Bottle → 直接下载解压:
HOMEBREW_BOTTLE_DOMAIN -
如果没有 → 使用 Formula,从源码编译安装:
HOMEBREW_API_DOMAIN
| 名称 | 作用 | 类比 |
|---|---|---|
| Formula | 告诉 Homebrew 如何安装软件(源码下载 + 编译步骤) | 菜谱,教你怎么做这道菜 |
| Bottle | 预先编译好的二进制包,安装时直接下载 | 已经做好的菜,直接端上桌 |
配置国内镜像源
-
上面安装部分介绍了如何在安装brew时就指定镜像源,但有些时候因为我们在安装时忘记配置,或者原来的镜像源已经失效需要重新配置,此时可以按照下面的方法进行配置。
-
此处以配置清华镜像源为例,阿里镜像源请参考阿里的官网文档–Homebrew镜像,科大源参考Homebrew
1 | ## 临时替换 |
-
恢复为默认的GitHub镜像源
1 | $ unset HOMEBREW_BREW_GIT_REMOTE |
Homebrew 常用的环境变量
| 环境变量 | 默认值 | 作用 / 用途 | 备注 |
|---|---|---|---|
| HOMEBREW_EDITOR | $EDITOR 或 vi |
指定 Homebrew 默认编辑器,用于 brew edit xxx |
可以设置为 subl, code, vim 等 |
| HOMEBREW_BREW_GIT_REMOTE | https://github.com/Homebrew/brew.git |
指定 Homebrew 核心仓库 Git 源,即brew命令本身 | 常用国内镜像,如阿里云 https://mirrors.aliyun.com/homebrew/brew.git |
| HOMEBREW_CORE_GIT_REMOTE | https://github.com/Homebrew/homebrew-core.git |
Homebrew Core 仓库 Git 源 ,4.0 后不再使用 | 国内镜像可设置为阿里云等 |
| HOMEBREW_API_DOMAIN | https://formulae.brew.sh/api |
Formula / Cask 元数据下载源 | 国内镜像可设置,如阿里云 https://mirrors.aliyun.com/homebrew-bottles/api |
| HOMEBREW_BOTTLE_DOMAIN | https://homebrew.bintray.com(旧)/ 官方默认 bottles 域 |
指定 bottle 二进制包下载源 | 国内镜像可设置,如阿里云 https://mirrors.aliyun.com/homebrew/homebrew-bottles |
| HOMEBREW_CASK_OPTS | [] |
设置 Cask 软件安装选项 | 常用示例:--appdir=/Applications |
| HOMEBREW_DOWNLOAD_CONCURRENCY | CPU 核心数的一半 | 设置下载并发数 | 4.6.0添加,可以加快多文件下载速度 |
| HOMEBREW_MAKE_JOBS | CPU 核心数 | 编译源码时的 make 并发数 | 可根据 CPU 调整,减少编译失败 |
| HOMEBREW_FORBID_PACKAGES_FROM_PATHS | 未设置 | 防止从本地路径安装 formula | 出于安全考虑,建议保留 |
| HOMEBREW_GITHUB_API_TOKEN | 未设置 | 提升 GitHub API 访问限额(匿名用户 60 次/h → 5000 次/h) | 必须为 GitHub PAT,可不选权限 scopes |
| HOMEBREW_SORBET_RUNTIME | 未设置 | 开发者模式下启用 Ruby Sorbet 类型检查 runtime | 普通用户可忽略 / unset |
| HOMEBREW_DEVELOPER | 未设置 | 是否开启 Homebrew Developer Mode | brew developer on/off 控制 |
| HOMEBREW_NO_AUTO_UPDATE | 未设置 | 禁止 brew 命令自动 update | 可以防止在运行brew install、brew upgrade、brew reinstall 等命令时自动执行一次 brew update |
| HOMEBREW_VERBOSE | 未设置 | 输出详细调试信息 | 调试 brew install 或编译失败时有用 |
HOMEBREW_GITHUB_API_TOKEN
-
如果使用brew默认的github镜像源,建议增加该环境变量
-
在你的GitHub账号中创建一个 PAT(Personal Access Token),无需授予任何权限,该token仅用于 brew 访问 GitHub API 时的身份验证。
-
brew 在执行 brew update、brew search、brew info、brew upgrade 以及 brew install(当需要从 GitHub 仓库下载 Formula 或 Cask 时)都会触发 GitHub API 请求
-
作用:提升 GitHub API 访问限额(匿名用户 60 次/h → 5000 次/h)
HOMEBREW_DEVELOPER
-
“开发者模式(developer mode)”,官方推荐通过
brew developer on/off控制开启和关闭,不要直接修改环境变量HOMEBREW_DEVELOPER=1 -
brew developer on/off会做三件事- 设置 HOMEBREW_DEVELOPER=1 或删除它
- 更新 Homebrew 内部的标记文件(metadata),让部分行为更一致
- 确保各类开发者功能完全启用/禁用
开发者模式的主要作用
-
启用更多开发/调试命令
| 命令 | 说明 |
|---|---|
brew audit |
审查 formula 是否符合规范 |
brew create |
生成新的 formula 模板 |
brew release-notes |
生成发布说明 |
brew tests |
运行开发者测试 |
brew ruby |
用 Ruby 运行 Homebrew 内部脚本 |
brew style |
执行 RuboCop 检查代码风格 |
-
显示更多调试信息 & 并关闭某些用户友好优化
- 更详细的错误日志输出
- 禁用某些缓存优化(例如 formula 缓存)
- 显示更详细的 curl / git / sandbox 信息
- 某些情况下启用更严格的行为(如 stricter audit)
-
可以避免某些“稳定版限制”
- 开发者模式允许安装一些未完全稳定、未正式发布的内容
- 允许访问 Homebrew 的内部 tap 工作流程
- 在不破坏本地 Brew 的情况下测试官方仓库 PR
-
在开发 Formula 或调试 Homebrew 时非常重要
- 轻松创建 formula (brew create)
- 运行 brew audit --strict 查看更严格的规范检查
- 调试变化中的 Homebrew 本体代码(brew/ 目录)
- 查看 Homebrew 内部 Ruby 执行过程
❗ 什么时候应该开启 HOMEBREW_DEVELOPER?
-
仅建议在以下情况下启用:
- 你要编写自定义 Formula / Cask
- 你要给 Homebrew 官方贡献 PR
- 你需要调试 Homebrew 行为
- 你要分析 Homebrew 的内部实现逻辑
-
如果你只是“普通用户,用来安装软件”,不建议设置,因为:
- 会输出更多日志
- 会激活一些你用不到的功能
- 可能导致行为与官方普通用户不一致
重要的说明
环境变量
-
brew安装的软件包会被软连接到
/usr/local/bin/下,所以需要将该路径加入系统环境PATH中 -
这里要注意一点,如果该路径在PATH中声明的比较靠前,就可能会被优先使用,比如我们已经手工在系统中安装了
python的某个版本,但通过brew安装某些软件包时因为其依赖python,就会通过brew同时安装对应的python版本,此时我们在使用python命令时,就会优先使用这个 -
有两种方法可以解决,1是通过
brew unlink python来解除链接,此时并不是删除,而只是解除了软链,不会影响依赖它的工具的使用,如果需要恢复链接,可以通过brew link python来恢复链接;2是将我们的系统中自己安装的一些工具的路径声明在/usr/local/bin/之前,这样就不会有影响了。
Homebrew 4.0 带来的新变化
-
Homebrew 4.0 进行了一项最大的改动,组织方式从Git仓库管理改为JSON文件下载。以前 Homebrew 安装时是“去拿一个 git 仓库 + 运行脚本”,现在是“下载一个大 JSON 数据库 + 直接用 metadata 安装/查 info”。
-
在你看到的
formula.jws.json、cask.jws.json、formula_tap_migrations.jws.json、cask_tap_migrations.jws.json,以及类似的 *.json 文件,其实是 Homebrew 用来统一、集中分发 “formula 和 cask 的元数据(metadata)” 的文件。
| 文件名 (或类型) | 用途 / 含义 |
|---|---|
formula.jws.json |
包含所有(或大部分)“core formula”(即主仓库 homebrew-core) 的 metadata 集合,用于安装/查询 formula。 |
cask.jws.json |
类似 formula.jws.json,但专门针对 GUI/应用程序类的 cask(来自 homebrew-cask 仓库)的 metadata。 |
formula_tap_migrations.jws.json |
记录那些从 core tap 中“迁移 (migrate/move)”出去的 formula —— 比如某 formula 不再属于 core,而被移到别的 tap 或 cask。让 Homebrew 能提示用户 “这个 formula 已经移走了,现在应该在别处”。 (ReadMex) |
cask_tap_migrations.jws.json |
对应 cask 的迁移 / 重命名 / tap 变动记录。 |
-
更具体地说,当你用
brew install <formula>或brew info、brew search等命令时,Homebrew 将不必总是从本地克隆(git) 的 tap 仓库里读取 Ruby 脚本,而是可以直接下载这些 JSON 文件 ——JSON-API—— 来获得formula/cask的名称、版本、依赖关系、描述 (description)、homepage、以及其它 metadata(比如以瓶装包 “bottle” 安装、analytics 数据、重命名/迁移信息等)。 -
JSON文件会从formulae.brew.sh下载,而不再使用
homebrew/core、homebrew/cask两个仓库,所以升级到4.0后,本地的homebrew/core、homebrew/cask仓库都可以删除以释放磁盘空间。
1 | # 查看本地仓库 |
-
如果还想使用旧的仓库模式,只要配置下环境变量
1 | echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc |
从镜像源的切换来理解brew下载安装包的过程
-
前面我们介绍过,切换镜像源时要设置4个环境变量,那么为什么要设置这几个变量呢?它们的作用是什么呢,下面我就一个一个说明:
-
HOMEBREW_BREW_GIT_REMOTE
- 设置brew仓库,用于更新brew命令本身,这个比较容易理解
-
HOMEBREW_CORE_GIT_REMOTE
- 设置core仓库,用于更新formula的安装脚本
- 当通过
brew info xxx查看安装包信息时,可以看到From信息,这个就是命令的安装脚本,比如下面的fd.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23$ brew info fd
==> fd: stable 10.2.0 (bottled), HEAD
Simple, fast and user-friendly alternative to find
https://github.com/sharkdp/fd
Conflicts with:
fdclone (because both install `fd` binaries)
Installed
/usr/local/Cellar/fd/10.2.0 (14 files, 2.9MB) *
Poured from bottle using the formulae.brew.sh API on 2024-11-29 at 18:02:16
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/f/fd.rb
License: Apache-2.0 OR MIT
==> Dependencies
Build: rust ✘
==> Options
--HEAD
Install HEAD version
==> Caveats
zsh completions have been installed to:
/usr/local/share/zsh/site-functions
==> Analytics
install: 6,327 (30 days), 24,518 (90 days), 116,476 (365 days)
install-on-request: 6,326 (30 days), 24,515 (90 days), 116,363 (365 days)
build-error: 0 (30 days)- 这个安装脚本中包含
bottle do部分,其作用是当安装脚本时,优先从该部分获取对应的操作系统的二进制预编译包的sha256校验值,如果从对应的二进制源中找到,则直接从二进制预编译包的地址进行下载,该预编译下载地址由HOMEBREW_BOTTLE_DOMAIN指定,默认从官方源下载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40class Fd < Formula
desc "Simple, fast and user-friendly alternative to find"
homepage "https://github.com/sharkdp/fd"
url "https://github.com/sharkdp/fd/archive/refs/tags/v10.2.0.tar.gz"
sha256 "73329fe24c53f0ca47cd0939256ca5c4644742cb7c14cf4114c8c9871336d342"
license any_of: ["Apache-2.0", "MIT"]
head "https://github.com/sharkdp/fd.git", branch: "master"
bottle do
sha256 cellar: :any_skip_relocation, arm64_sequoia: "9d17cfb029fbdc6ed31c732108f7aa746d3082dd4783ed35471ef79340615509"
sha256 cellar: :any_skip_relocation, arm64_sonoma: "82d5c2ffc2e2d0d8643a7c3f620c81ed49d7b23920aa23b6a7f4c50be69abc0b"
sha256 cellar: :any_skip_relocation, arm64_ventura: "354412ababb7d6c52abd9153ff96f133391406ce292b2122c76b96c2ab714f87"
sha256 cellar: :any_skip_relocation, arm64_monterey: "0b41f292041767fd1c3c5b92daaa6c823fb07c1d7cd11b0427a415f08463f035"
sha256 cellar: :any_skip_relocation, sonoma: "4fa0fb4b3f512e45d35c569953efc7c59ebd8976caac9b2c1b1394b7e29157a0"
sha256 cellar: :any_skip_relocation, ventura: "b1406e5414252b1e1b90cfad188454eb31058256ed6246baed48c4e1cfe593a1"
sha256 cellar: :any_skip_relocation, monterey: "0ac060bf7d1529aa1f65e634f64b98b906df533d71f2185c883165c01f59ad53"
sha256 cellar: :any_skip_relocation, x86_64_linux: "2464fb21cc981166ffa9783fa14a09265790af4d89ce3a763421ddaf29119541"
end
depends_on "rust" => :build
conflicts_with "fdclone", because: "both install `fd` binaries"
def install
system "cargo", "install", *std_cargo_args
man1.install "doc/fd.1"
generate_completions_from_executable(bin/"fd", "--gen-completions", shells: [:bash, :fish])
zsh_completion.install "contrib/completion/_fd"
# Bash completions are not compatible with Bash 3 so don't use v1 directory.
# bash: complete: nosort: invalid option name
# Issue ref: https://github.com/clap-rs/clap/issues/5190
(share/"bash-completion/completions").install bash_completion.children
end
test do
touch "foo_file"
touch "test_file"
assert_equal "test_file", shell_output("#{bin}/fd test").chomp
end
end- 注意,brew4.0后不再使用从该git仓库中获取安装脚本,因为formula的安装源代码已经全部存储在json文件中(见
HOMEBREW_API_DOMAIN说明),不再需要通过Git仓库下载 - 切换镜像源时,brew4.0后不需要设置该环境变量
-
HOMEBREW_API_DOMAIN
- 设置
formula\cask的安装脚本下载源,默认https://formulae.brew.sh - brew4.0后不再从git仓库获取安装脚本,而是从这个json文件中一次性获取所有工具的安装脚本,默认24小时更新一次
1
2
3
4
5
6
7官方源:
formula源:https://formulae.brew.sh/api/formula.jws.json
cask源:https://formulae.brew.sh/api/cask.jws.json
清华源:
formula源:https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api/formula.jws.json
cask源:https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api/cask.jws.json- 如果还想使用旧的仓库模式,只要配置下环境变量,这样即使你升级后已经删除了对应的仓库,它也会在第一次使用到时自动下载
1
2# 官方也提到,非开发人员没必要这样做
echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc - 设置
-
HOMEBREW_BOTTLE_DOMAIN
- 指定预编译二进制包(也称为 bottles)的下载地址,Homebrew 使用这些 bottles 来加速软件安装过程,避免在每个用户的计算机上都重新从源代码构建软件。
- 当我们通过
brew install xxx安装软件时,brew会先从该formula的安装脚本(4.0以前从HOMEBREW_CORE_GIT_REMOTE指定的git仓库获取,4.0以后从HOMEBREW_API_DOMAIN指定的json文件中获取)中获取该软件的安装信息,然后根据安装信息从bottle中下载对应的预编译二进制包,再将其安装到本地。 - 下载后的二进制包会被保存到缓存目录中(
brew --cache),安装后的软件包存储到Cellar目录中(brew --cellar)
-
-
通过上面的分析,我们可以得出结论,切换镜像源时,实际上只需要设置3个变量就够了
1 | HOMEBREW_BREW_GIT_REMOTE |
记录一次MacOS升级后导致vim不可用的解决过程
-
- 升级MacOS后,
vim不可用,提示如下错误:
- 升级MacOS后,
1 | ~ vim |
-
- 这是 macOS 升级后常见的 Vim 运行报错,原因是:
- 你之前安装的 Vim(Homebrew 版本)是链接到旧系统的 Perl 库 /System/Library/Perl/5.30/…
- 升级系统后这个库路径已经不存在了,所以运行 vim 时动态链接失败。
-
- 解决办法:重新安装 Vim
1 | # 删除缓存,避免旧版本的残留文件阻塞继续安装 |