Homebrew
Homebrew 的概念
一款 Mac OS 平台下用 Ruby 脚本和 GIT 管理来实现的软件包管理工具,现在由 GitHub 上的软件工程师 Mike McQuaid 维护开源代码。
主要从下载的源码包解压(包含相关依存库),同时自动配置好各种环境变量,并且 Homebrew 会自动为你解决软件包的依赖问题。可以一条命令完成软件的安装、升级、卸载等操作。
通过 Homebrew 下载安装的软件全部来自对应的软件官网,无需担心下载源的安全问题。如果是原本要付费的应用也仍旧是要购买的,并不是用 Homebrew 就能绕过付费的门槛。
使用 Homebrew 有这些优势:
brew install
安装各类环境、库、编译器等。brew cask install
安装 macOS 应用,字体和插件以及其他非开源软件。brew upgrade
与brew cask upgrade
承包了所有包的「一键更新」。
对于高阶用户,Homebrew 还有这些优势:
- 包将安装到 Homebrew 自己的目录,然后将其文件符号链接到
/usr/local
。- Homebrew 不会在其前缀之外安装文件,可以在任意位置放置 Homebrew 的根目录。
- 使用 Git 和 Ruby 为操作单元,可以轻松还原所做的修改并合并上游更新。
- 轻松创建、发布自己的 Homebrew 软件包。
brew 专有名词解释
术语 | 意译 | 说明 |
---|---|---|
formula | 配方 | 表示安装包的描述文件。复数为 formulae。 |
cask | 木桶 | 装酒的器具,表示具有 GUI 界面的原生应用。 |
keg | 小桶 | 表示某个包某个版本的安装目录,比如 /usr/local/Cellar/foo/0.1。 |
Cellar | 地窖 | 存放酒的地方,表示包的安装目录,比如 /usr/local/Cellar |
Caskroom | 木桶间 | 表示类型为 Cask 的包的安装目录,比如:/usr/local/Caskroom。 |
tap | 水龙头 | 表示包的来源,也就是镜像源。(third-party-repositories)就是第三方存储库 |
bottle | 瓶子 | 表示预先编译好的包,下载好直接使用。 |
brew 组成
名称 | 说明 |
---|---|
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安装
前置安装:Command Line Tools for Xcode
默认安装路径:/opt/homebrew(ARM架构)或/usr/local(x86架构)
Homebrew 的文件路径说明
- Homebrew :brew 程序所在路径,homebrew 的仓库位置默认位于/usr/local/Homebrew或/opt/homebrew下
- Cellar :文件夹存放的是所有包安装所在路径,包括二进制,文档和配置文件,按照这样 Cellar/包名/版本号/ 的形式来安放。
- keg:具体某个包所在的目录,是 cellar 的子目录。
- bin :所有包安装之后二进制都会链接到这个路径下
- share :所有包安装之后的文档都会链接到这个路径下
- etc :同上,所有包的配置文件
- lib :同上,所有包相关库文件
常用变量
- HOMEBREW_AUTO_UPDATE_SECS:在一些命令前每
HOMEBREW_AUTO_UPDATE_SECS
秒运行一次brew update
- HOMEBREW_NO_AUTO_UPDATE:禁用brew自动更新(若使用此设置需确保每次使用brew时手动运行
brew update
命令)- HOMEBREW_BOTTLE_DOMAIN:指定二进制软件包下载镜像URL
Homebrew 源切换
安装后,如果使用
brew install
、brew upgrade
、brew update
较慢,可以考虑切换为国内的镜像源,比如:
如果使用 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 和软件包更新
简单理解:更新应用程序要更新应用商店的库存,由于国内的网络不太友好,更新往往卡在
Updating homebrew...
这里,逼死众多玩家。VPN 方式实测也没有太大改观,这里介绍替换 Homebrew 软件源的做法,实测更为实用。
自 4.0 起,有一些变化:
- 默认使用从 Formulae.brew.sh 下载的 JSON 文件进行包的安装,而不是本地
homebrew/core
和homebrew/cask
源。可以考虑使用brew untap homebrew/core
和brew untap homebrew/cask
来节省一些空间(除非你正在开发包)。
默认情况下,在执行
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 安装软件可能会长时间卡在Updating Homebrew 这个步骤,最好有学术上网。
如果卡了就按住control + c 组合键之后命令行会显示 ^C,就代表已经取消了 Updating Homebrew 操作,大概不到 1 秒会重新去执行原本所操作的命令,此法是一次性的(推荐使用)。
永久性的方法有两个:
- 更改成国内的 Homebrew 镜像源加速安装下载命令,也就是换个软件服务器下载。homebrew 是托管于 github,如果你可以访问这个网站就不需要换了。如果不能访问就更改下载源,相当于给你的 git 仓库换一个远程地址。
- 可以用环境变量禁用命令来禁用每次安装前的自动更新:HOMEBREW_NO_AUTO_UPDATE=1
更新软件包的流程是,首先更新 Homebrew 自己,就像打开应用商店需要刷新一样;库存更新之后对比最新库存与已经安装的软件包的版本,查看哪些软件包可以更新;最后更新即可。首先介绍避免更新 Homebrew 卡死问题的步骤:
替换 Homebrew 的软件源。包括
brew.git
,homebrew-core.git
和homebrew-bottles
。如果有额外源,也可以进行替换,但清华镜像仅提供前三者的镜像。# 替换软件源: git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git # 更换homebrew-bottles: export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
之后再触发 Homebrew 的更新,将从清华镜像获取最新内容,速度非常快。默认在进行
install
指令时会触发更新,也可通过brew update
指令主动触发更新。
给 Homebrew 增加其他源
Homebrew 默认拥有「core」与「cask」两大仓库,简单理解:搜索软件包时,从这两个仓库检查是不是有匹配的软件包。使用
tap
指令可以为 Homebrew 增加更多的软件仓库「软件源」。这里列举常用的软件源,但不做过多解释,更多介绍见Taps 介绍与仓库地址。
brew tap homebrew/aliases
# homebrew/aliases 指令替身
# homebrew/homebrew-cask-drivers 驱动软件包
# homebrew/homebrew-cask-versions 软件包的历史版本
# homebrew/homebrew-cask-fonts 字体库
# beeftornado/rmtree 循环移除指令集
Homebrew Cask和Homebrew的区别
可以简单地将 Homebrew 的包分为命令行工具、GUI 应用两类。
如安装的是 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
...
Homebrew 偏向于开发,主要用于在终端使用命令行的软件。我们只需要知道,除了在终端使用的软件,如果你只是想要管理 App Store 的软件的话,只需使用 Homebrew Cask 就足够了。
Homebrew Cask:是 Homebrew 附带的扩展、用来安装和管理 GUI 的 macOS app 的工具,作为已经编译好了的应用包 (.dmg/.pkg),统一放在目录 /opt/homebrew-cask/Caskroom 中,brew cask 可以看作是苹果官方 app store 的补充。
有很多好用免费 的 Mac 软件没有在 App Store 上架,一般我们都要去软件所在的官网下载安装,这样太麻烦了。使用 Cask 就可以通过一行命令从软件官方网站直接下载软件包,在终端后台安装。
通过 Cask 安装的软件也会在应用程序里显示,跟从 App Store 安装的软件没啥区别,Cask 安装只是比普通安装方法节省了时间和步骤,还可以统一更新升级管理所有的应用软件。
Cask 安装
终端输入 brew install cask 命令行,注意网速很重要,不然会安装失败,失败了就重新执行命令,它能断点安装。这个安装命令有点慢,估计要两个小时以上。
然后输入 brew cask 验证命令完整性,如果没有安装成功,会开始克隆 Github 上的 caskroom/cask 库到本机 。如果 CASK 安装成功了,会出现”no subcommand given”找不到子命令这种错误
Cask 常用命令
如果卡在更新,不要用取消命令,等待就好。
#安装软件命令
brew cask install 软件名
#卸载 brew 下载的应用,不要从 App Store 直接删除,不然数据会被保留。
brew cask uninstall 软件名
#最干净的卸载,完整地抹掉一个应用。
brew cask zap 软件名
#查找相关软件的信息
brew cask info 软件名
#列出通过 Homebrew Cask 安装的包
brew cask list
#升级 Homebrew Cask
brew cask upgrade
#可显示所有其他的 commands 命令
brew cask help
Homebrew 常用命令
# Homebrew文档
brew --help # 帮助文档
man brew # man文档
brew docs # 在线文档
# Homebrew主页
brew home|homepage
# 检查Homebrew:用于检查 Homebrew 当前配置是否合理,或者某些包存在的问题等
brew doctor|dr
# 自动添加环境变量(配置文件脚本中常用)
/opt/homebrew/bin/brew shellenv
# 查看Homebrew配置信息
brew config|--config
brew -v | --version # 显示Homebrew版本
brew --repo # 显示Homebrew本地的Git仓库
brew --prefix # 显示Homebrew安装路径
brew --cellar # 显示Homebrew Cellar路径
brew --caskroom # 显示Homebrew Caskroom路径
brew --cache # 显示Homebrew缓存路径
# 更新Homebrew本地仓库索引
brew update
# 更新软件列表(不带软件名就升级 brew 自身。)
brew upgrade
brew upgrade <package> # 更新指定包
brew upgrade --cask <package> # 更新指定GUI应用
brew upgrade --cask --greedy <package> # 启用贪婪模式
# 搜索包:可以用正则表达式命令搜索。如:brew search /^vi/表示只能是 vi 开头brew search /^vi\\w$/表示只能是 vi 开头并且只有三个字母
brew search <keyword>
# 列出已安装的包
brew list|ls # 所有已安装的包,包括formulae和casks
brew list --formula # 所有已安装的formulae
brew formulae # 所有已安装的formulae
brew list --cask # 所有已安装的casks
brew casks # 所有已安装的cask
brew list <package> # 列出指定包的详细信息
# 安装指定包:安装指令并非只支持名字,也可以用文件安装包括网络文件和本地文件。brew install 文件包.rb # 本地 或 brew install 网址# 远程
brew install <package> # 默认安装最新版本
brew install --cask <package> # 安装指定GUI应用
brew install <package>@<version> # 安装指定版本的包
# 列出可更新的包(更新过时的包):不带包名,就会更新所有的包
brew outdated # 所有可更新的包,包括formulae和casks
brew outdated --formula # 所有可更新的formulae
brew outdated --cask # 所有可更新的casks
# 锁定某个不想更新的包
brew pin <package-name> # 锁定指定包
brew unpin <package-name> # 取消锁定指定包
# 卸载指定包
brew uninstall|remove|rm <package> # 默认卸载最新版本
brew uninstall --cask <packafe> # 卸载指定GUI应用
brew uninstall <package>@<version> # 卸载指定版本的包
brew uninstall --ignore-dependencies <package> # 即使该包是其他包的依赖也会卸载
# 卸载依赖包
brew autoremove
brew autoremove -n|--dry-run # 预览将要被卸载的依赖包
# 重装指定包
brew reinstall <package>
brew reinstall <package>@<version> # 重装指定版本的包
# 切换指定包的版本
brew switch <package> <version>
# 清理旧包
brew cleanup # 清理所有旧版本的包
brew cleanup <package> # 清理指定的旧版本包
brew cleanup -n # 查看可清理的旧版本包
# 查看包信息
brew info # 显示安装的软件数量,文件数量以及占用空间
brew info <package> # 显示某个包信息,默认只显示该包最高版本的信息(即使该包未安装)
# 服务管理
brew services start <service_name> # 启动服务并开启登录自启
brew services run <service_name> # 启动服务并取消登录自启
brew services stop <service_name> # 停止服务
brew services restart <service_name> # 重启服务
brew services kill <service_name> # 强制杀死服务进程
brew services list # 显示所有已启动的服务
brew services cleanup # 清理无用服务
关于brew tap命令
Taps 本身指的是第三方仓库。
简单的理解是:除了自带的两个仓库「Formulae」与「Casks」,使用
tap
指令可以添加更多的仓库。这些仓库默认从 Homebrew 自己的 Github 仓库添加,但也可以是第三方的仓库「甚至可以是你自己的仓库」。
有更多的仓库,就收录了更多的软件包,也就能通过 Homebrew 安装更多的内容。
使用
brew tap
查看当前所有的仓库:
~ > brew tap
beeftornado/rmtree # 循环移除指令的仓库
homebrew/cask # 「Casks」
homebrew/cask-fonts # 字体仓库
homebrew/cask-versions # 历史版本软件包仓库
homebrew/core # 「Formulae」
homebrew/services # 服务指令仓库
不带参数的话,将会列出当前所有仓库,比如自带的 CORE 仓库。
如果装了 CASK 扩展,就会显示 CASK 仓库。可以添加多个 tap formulae 。如果你在核心仓库没有找到你需要的软件,那么你就需要安装第三方的仓库去安装你需要的软件。tap 命令的仓库源默认来至于 Github,但也不限制于这一个地方。
你也可以用官网的命令自己去创建 Homebrew 包、自制 TAP、 cask 。
参考: