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
通常是 zsh
或 bash
,對應的配置文件為 ~/.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/core
和homebrew/cask
源。可以考慮使用brew untap homebrew/core
和brew untap homebrew/cask
來節省一些空間(除非你正在開發包)。可以考慮將
HOMEBREW_NO_INSTALL_FROM_API
移除(如果設置過)。可以考慮將
HOMEBREW_API_DOMAIN
設為指定鏡像源(如果使用新的安裝方式)。自動運行
brew update
的頻率由5min
改為24h
。可以重新考慮是否需要設置HOMEBREW_NO_AUTO_UPDATE
、HOMEBREW_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 install
、brew upgrade
、brew 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 install
、brew upgrade
、brew 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
為例:
Homebrew 將 git 下載至
/usr/local/Cellar/git/<version>/
目錄下,其二進制文件在/usr/local/Cellar/git/<version>/bin/git
。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 # 顯示安裝的軟件數量、文件數量以及占用空間