MacOs Homebrew详解

205 阅读5分钟

安装

#全自动安装脚本,包含更换源
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
#卸载脚本
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)"

术语

以下是 homebrew 官方文档中出现的一些术语

英文直译实际含义
formula(e)公式;配方安装包的描述文件,formulae 为复数
cask木桶装酒的器具,表示具有 GUI 界面的原生应用,安装 macOS native 应用的扩展
keg小桶表示某个包某个版本的安装目录,比如 /usr/local/Cellar/foo/0.1。
Cellar地窖存放酒的地方,表示包的安装目录,比如 /usr/local/Cellar。
Caskroom木桶间表示类型为 Cask 的包的安装目录,比如:/usr/local/Caskroom。
tap(插入)水龙头下载启用某个源
bottle瓶子表示预先编译好的包,下载好直接使用,不需要现场下载编译源码,速度会快很多;
官方库中的包大多都是通过 bottle 方式安装
bundle描述 Homebrew 依赖的扩展

这些术语只是帮我们更好的理解 homebrew 是如何管理各种各样的包的,他们其中有些是我们可以在文件命名中看到的,有些只是一种抽象概念。 比如 Tap 可以理解为启用一个源 brew tap xxx,xxx是没有任何配方的,只是扩展程序,比如homebrew- services,所以tap可以理解为扩展;也可以理解为 homebrew 支持的一种机制,允许从第三方源下载包。

组成

  1. brew(Homebrew 源代码仓库)

    • 这是 Homebrew 的核心命令行工具,用户通过它来执行各种包管理操作,例如安装、更新、删除软件等。
    • Homebrew 主程序本身包含了所有的逻辑代码,比如:
      • 安装和管理包:通过 brew install 安装软件。
      • 更新软件:通过 brew update 获取配方和核心代码的更新。
      • 升级软件:通过 brew upgrade 更新已安装的软件。
      • 搜索软件:通过 brew search 查找可用的包。
      • 信息显示:通过 brew info 获取已安装软件的详细信息。
    • Homebrew 主程序的 Git 仓库地址是:https://github.com/Homebrew/brew
  2. homebrew-core(Homebrew 核心公式库)

    • homebrew-core 是 Homebrew 的 核心软件包公式库,存放了 Homebrew 默认支持的软件包配方(Formula)。
    • 每个软件包的配方定义了如何下载、编译、配置和安装一个软件包。比如,如果你运行 brew install git,Homebrew 会从 homebrew-core 仓库中获取 git 的配方并执行安装。
    • 核心公式库包括了大量的命令行工具和开发工具包,像 git, python, node, wget 等常见软件都在其中。
    • homebrew-core 的 Git 仓库地址是:https://github.com/Homebrew/homebrew-core
  3. homebrew-cask(Homebrew Cask 仓库)

    • 提供 macOS 应用和大型二进制文件的安装,专门用于管理 图形界面应用(GUI) 的安装。
    • 它通过 Cask 配方(类似于 Core 中的 Formula 配方)来定义如何安装桌面应用、字体、插件等。比如,使用 brew install --cask google-chrome 可以安装 Google Chrome。
    • Homebrew Cask 在默认情况下包含大量常用的 GUI 应用程序,例如 Google Chrome, Slack, Visual Studio Code, Tunnelblick 等。
    • cask-versions,Homebrew Cask 和 Homebrew 一样,默认库只维护最新版本。
  4. homebrew-tap(源)

    • Homebrew 支持的软件源,本质上是 Git 仓库,用户可以创建和维护自己的 tap 仓库,允许用户从 第三方 仓库添加额外的软件包或应用。
    • 你可以通过 brew tap 添加额外的仓库,例如:brew tap caskroom/caskbrew tap homebrew/cask 来获得更多软件的安装选项。
  5. Homebrew 本地缓存与资源目录

    • Homebrew 会在本地缓存一些下载的数据,以便在下一次安装或更新时加速过程。缓存目录通常位于:
      • ~/Library/Caches/Homebrew:缓存软件包的下载文件。
      • /usr/local/Homebrew:Homebrew 本身的安装目录。
    • 这些缓存数据有助于提高安装效率,并避免重复下载相同的软件包。
  6. homebrew-services (后台服务仓库)

    • 用于在 macOS (launchctl) 与 Linux (systemctl) 上管理 brew 安装的后台服务。例如,安装一些需要常驻后台运行的应用(如数据库、代理服务、Web 服务器等)。
    • brew services [start|] 允许你启动、停止和管理这些服务,确保它们在系统启动时自动启动。

工作原理

  • 当你执行 brew install <package> 时,Homebrew 会从 homebrew-core 或你添加的其他 Tap 仓库中获取相应的配方(Formula),然后通过编译源代码或直接下载预编译的二进制包进行安装。
  • 如果你执行 brew update,Homebrew 会更新 Homebrew 主程序 和所有已配置的公式源,确保你获得最新的软件包版本。
  • 通过 brew cask install <app>,Homebrew 会安装图形界面应用,并将其放入 /Applications 文件夹。

查看brew安装列表

➜  ~ brew ls
==> Formulae
brotli		icu4c@76	lz4		nrm		openvpn
c-ares		libnghttp2	lzo		nvm		pkcs11-helper
ca-certificates	libuv		node		openssl@3

==> Casks

看到formulae下有安装的openvpn,看看安装的在哪

➜  ~ which openvpn
/opt/homebrew/sbin/openvpn

可以看到它的安装路径,让我们访问它

➜  ~ ls -l /opt/homebrew/sbin/openvpn
lrwxr-xr-x@ 1 lihanting  admin  37  2 21 14:47 /opt/homebrew/sbin/openvpn -> ../Cellar/openvpn/2.6.13/sbin/openvpn

可以看到输出了个软链接,指向了cellar,即真正的物理地址在cellar下面

更换homebrew的源

这里记录一些有关brew的命令,在没有git时更换brew的源可以通过在 ~/.zshrc 文件中添加环境变量来,比如 HOMEBREW_BREW_GIT_REMOTE="mirrors.ustc.edu.cn/brew.git" 。由于brew是基于git的,所以有了git后也可以通过git命令更换源。

#查看brew.git当前源
git -C "$(brew --repo)" remote -v
git -C "$(brew --repo homebrew/core)" remote -v

# 查看 homebrew-core.git 当前源
$ cd "$(brew --repo homebrew/core)" && git remote -v
origin    https://github.com/Homebrew/homebrew-core.git (fetch)
origin    https://github.com/Homebrew/homebrew-core.git (push)

# 修改 brew.git 为阿里源
$ git -C "$(brew --repo)" remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git

# 修改 homebrew-core.git 为阿里源
$ git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git

# zsh 替换 brew bintray 镜像
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
$ source ~/.zshrc

# bash 替换 brew bintray 镜像
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile

# 刷新源
$ brew update