使用 macOS 系统后,经常会使用 brew 安装工具或软件,但对其了解不多,遂翻看官方文档,了解其常用命令,整理如下
安装 Homebrew
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
国内使用参考:清华大学开源软件镜像站 - Homebrew / Linuxbrew 镜像使用帮助
设置了默认源后,如需重置为官方地址,执行以下命令
$ cd "$(brew --repo)"
$ git remote set-url origin https://github.com/Homebrew/brew.git
更新 Homebrew 自身
$ brew update
使用 Homebrew 安装软件
以下是安装 wget 下载器的示例
$ brew install wget
卸载
$ brew uninstall wget
以下是安装 Zed 编辑器的示例
$ brew install --cask zed
卸载
$ brew uninstall --cask zed
读者应该已经发现安装命令一个带有 --cask 参数,一个不带,原因请往下看
Formulae 和 Cask
首先我们知道在 macOS 下的工具、软件有两种类型,一种是二进制程序或库,如 git、wget,放置到指定目录后可以通过命令行运行,另一类是原生的图形化界面程序,通常需要 “拖拽到文件夹📁” 来安装,如 chrome、vs code 等
Homebrew 支持这两类软件的安装,安装前者的方案称为 Formula、后者称为 Cask
在 Homebrew 中,Formulae 可以翻译为 "配方" 或 "公式"。它是用于安装和管理命令行工具、库和软件包的规范。每个软件包都对应一个配方,它包含了软件包的元数据信息、依赖关系、下载地址和安装脚本等。每个 Formula 是一个 Ruby 脚本,描述了如何安装一个单一的命令行软件包
后文对于 formula 不进行翻译,因为称其为 “配方” 实在有些拗口,而 formula 更为大家所熟知。
检索软件包信息
查找 ffmpeg formula
$ brew search ffmpeg
查看 ffmpeg formula 详细信息
$ brew info ffmpeg
$ brew upgrade ffmpeg
查看本机已安装的 Formulae,命令如下
$ brew list --formula
相应的,查询已安装的 Casks,添加 --cask 参数即可
$ brew list --cask
不带参数则查询两者
至此,我们安装的软件都是使用官方的 Homebrew 仓库,Homebrew 支持第三方软件仓库,个人可以创建自己的软件安装方案放在其中,在 Homebrew,第三方仓库称为 Tap,它基于文件夹,往往存放在 Github 公开仓库。
存储库 Tap 相关信息
简单说,Tap 就是第三方软件源
添加一个 tap 命令如下
$ brew tap homebrew/cask-fonts
使用命令 brew tap
可以查看本机已添加仓库列表
$ brew tap
filosottile/musl-cross
homebrew/cask-fonts
homebrew/services
macos-fuse-t/cask
vectordotdev/brew
添加 tap 后,可以安装 tap 提供的软件包,以下安装 Inconsolata 字体
$ brew install font-inconsolata
查看 font-inconsolata 详情,可以看到它对应的配方是:https://github.com/Homebrew/homebrew-cask-fonts/blob/HEAD/Casks/font-inconsolata.rb
添加 tap 源不是安装其内软件的必要条件,直接从仓库安装也是可以的
$ brew install homebrew/cask-fonts/font-inconsolata
了解 Homebrew 存储位置
对于 Formula、Cask、Tap 有了一些概念,在继续进行之前,先看看 Homebrew 的安装目录,对其有更进一步的了解。
获取 Homebrew 目录,我这里显示的目录是 /opt/homebrew,即 brew 自身及安装的软件都在这个目录中,不会在系统中胡乱放置资源,污染磁盘。
$ brew --prefix
/opt/homebrew
其目录内容存储的文件及文件夹如下
/opt/homebrew/Cellar 目录
Homebrew 将所有安装的软件包统一放置在这个目录下,每个软件包都会有自己的子目录,里面包含了该软件包的所有文件。
Cellar
├── ack
│ └── 3.7.0
├── aom
│ └── 3.8.2
├── aribb24
│ └── 1.0.4
├── asciinema
│ └── 2.4.0
├── autoconf
│ └── 2.72
以 go 程序为例
$ ls Cellar/go*
Cellar/go:
1.22.2
Cellar/go@1.19:
1.19.13
旧版本存储在 go@1.19 中,新版本存储在 go 目录,是便于在机器上能使用 go 的多个版本
/opt/homebrew/opt 目录
opt 目录着存储指向特定软件包最优或者说“被选中”的版本的符号链接(symlinks),Homebrew 不直接使用 Celler 目录下的软件包。
可以看到软链接指向的具体程序
/opt/homebrew/bin
回到 Homebrew 查看,还能看到一个 bin 目录,bin 目录也存储的是软链接,也指向 Celler 目录中的程序。
跟 opt 下的链接作用不同,前者链接通常指向软件的具体可执行文件,后者主要是为了让用户和程序能够引用到一个不随软件版本而变化的路径,指向的是整个软件包的安装目录。
/opt/homebrew/Caskroom
见名知意,它存储着 Cask 类型软件
Caskroom
├── buzz
│ └── 0.8.4
├── font-fira-code
│ └── 6.2
├── font-inconsolata
│ └── latest
├── fuse-t
│ └── 1.0.36
├── fuse-t-sshfs
│ └── 1.0.1
├── iterm2
│ └── 3.4.19
├── visual-studio-code
│ └── 1.78.2
└── zed
└── 0.129.2
17 directories, 0 files
另外的一些目录,如:“/opt/homebrew/etc”、“/opt/homebrew/var”、“/opt/homebrew/lib”、“/opt/homebrew/include” 等,从名字也能看出,他们作为 “系统目录” 供 Homebrew 使用,后续有需要查看 Lib、修改服务配置的需要,可以到里边找。
知晓了 opt 目录的作用,那么在 Goland 设置 GOROOT 变量就不会很纠结,使用 opt 而不是 Celler 下的目录是更推荐的方式。
同样,出于某些原因,我们需要设置一些环境变量,可以使用 opt 链接
$ export PATH="/opt/homebrew/opt/openjdk@11/bin:$PATH"
$ export PATH="/opt/homebrew/opt/redis@6.2/bin:$PATH"
了解了 Homebrew 目录结构,接下来继续看的功能
Services 服务
启动服务(如未安装先执行 brew install redis@6.2)
$ brew services start redis@6.2
查询服务列表
$ brew services list
停止命令是
$ brew services stop redis@6.2
启动 redis@6.2 依赖的是 .plist 文件,它描述服务的启动和停止命令及参数。
我们可以在 Cellar 目录下找到 Redis 服务的对应 .plist 文件,我电脑上的路径是:Cellar/redis@6.2/6.2.14/homebrew.mxcl.redis@6.2.plist
同目录还有个 homebrew.redis@6.2.service 文件,打开查看一定不陌生,它是 systemd 的应用配置
[Unit]
Description=Homebrew generated unit for redis@6.2
[Install]
WantedBy=default.target
[Service]
Type=simple
ExecStart=/opt/homebrew/opt/redis@6.2/bin/redis-server /opt/homebrew/etc/redis.conf
Restart=always
WorkingDirectory=/opt/homebrew/var
StandardOutput=append:/opt/homebrew/var/log/redis.log
StandardError=append:/opt/homebrew/var/log/redis.log
切换软件版本
切换版本会更新 bin 目录下的软链接、需要先删除,再创建
使用 go@1.19 版本的 go
$ brew unlink go && brew link go@1.19
切换到 go@1.22 版本的 go
$ brew unlink go && brew link go@1.22
切换到最新版本的 go,本例是 Go 1.22 版本
$ brew unlink go && brew link go
除切换版本,当我们发现所需的命令未在 /opt/homebrew/bin 目录下,可以使用 link 在 bin 目录下创建到 Celler 的软链接
$ brew link redis@6.2
设置环境变量
最后,如果找不到 /opt/homebrew/bin 下的命令,排查确认 PATH 环境变量中包函路径:/opt/homebrew/bin
$ export PATH="/opt/homebrew/bin:$PATH"
临时添加,或将其写入到 ~/.zshrc 文件
基本上了解了 Homebrew 这些知识后,使用起来会更加 “流畅”,高阶使用参考官方文档