Homebrew

Homebrew 的概念

一款 Mac OS 平台下用 Ruby 脚本GIT 管理来实现的软件包管理工具,现在由 GitHub 上的软件工程师 Mike McQuaid 维护开源代码。

主要从下载的源码包解压(包含相关依存库),同时自动配置好各种环境变量,并且 Homebrew 会自动为你解决软件包的依赖问题。可以一条命令完成软件的安装、升级、卸载等操作。

通过 Homebrew 下载安装的软件全部来自对应的软件官网,无需担心下载源的安全问题。如果是原本要付费的应用也仍旧是要购买的,并不是用 Homebrew 就能绕过付费的门槛。

使用 Homebrew 有这些优势:

  • brew install安装各类环境、库、编译器等。
  • brew cask install安装 macOS 应用,字体和插件以及其他非开源软件。
  • brew upgradebrew 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 installbrew upgradebrew 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/corehomebrew/cask 源。可以考虑使用 brew untap homebrew/corebrew untap homebrew/cask 来节省一些空间(除非你正在开发包)。

默认情况下,在执行 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 安装软件可能会长时间卡在Updating Homebrew 这个步骤,最好有学术上网。

如果卡了就按住control + c 组合键之后命令行会显示 ^C,就代表已经取消了 Updating Homebrew 操作,大概不到 1 秒会重新去执行原本所操作的命令,此法是一次性的(推荐使用)

永久性的方法有两个:

  1. 更改成国内的 Homebrew 镜像源加速安装下载命令,也就是换个软件服务器下载。homebrew 是托管于 github,如果你可以访问这个网站就不需要换了。如果不能访问就更改下载源,相当于给你的 git 仓库换一个远程地址。
  2. 可以用环境变量禁用命令来禁用每次安装前的自动更新:HOMEBREW_NO_AUTO_UPDATE=1

更新软件包的流程是,首先更新 Homebrew 自己,就像打开应用商店需要刷新一样;库存更新之后对比最新库存与已经安装的软件包的版本,查看哪些软件包可以更新;最后更新即可。首先介绍避免更新 Homebrew 卡死问题的步骤:

  • 替换 Homebrew 的软件源。包括brew.githomebrew-core.githomebrew-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 。

参考:

posted @ 2024-04-16 12:55  CD、小月  阅读(13)  评论(0编辑  收藏  举报