macOS 上各种软件的管理,只要有 Homebrew 就足够了。
Homebrew 是一款享有盛名的包管理工具,是 macOS 上包管理的事实(de facto)标准 。Homebrew 的意思是家酿啤酒。
它的官方 slogan 是 The missing package manager for macOS (or Linux)。Linuxbrew 已经在 Homebrew 1.9正式合入,成为 Homebrew 的“一等公民”1。
Homebrew 最早的创建者是 Max Howell,目前的主要维护者是 Mike McQuaid。同 Jekyll 等开源项目一样,Homebrew 的核心维护者也是 GitHub 的员工。GitHub 对于员工亲自参加开源项目方面,做得一直不错。
顺带插播一条奇闻逸事:Homebrew 的创始人 Max Howell 活跃在开源社区,目前主要从事 Swift 相关的库开发。他在2015年初曾去 Google 面试,因为“白板”写算法题「翻转二叉树」失败,愤而发 tweet 讽刺:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off. 2
对于使用 Unix/Linux 类系统的用户往往都遇到过这些需求:
./configure
参数超多,还要解决各种库的依赖各 Linux 发行版为了提升安装软件的体验,大多都提供了官方的包管理器,如 Ubuntu 的 aptitude (apt-get)。而苹果官方没有为 macOS 提供包管理器,市面上最好的解决方案就是 Homebrew。
目前 Homebrew 的中文内容大多以简单入门级教程为主,对于它的各类能力提之甚少,我希望在这里更全面的分享 Homebrew。
网上基础的教程很多,我这里只简略的介绍下。对于基础功能类的深度用法,推荐这篇 macOS 包管理工具 Homebrew 不完全指南。
开始安装前需要安装 macOS 命令行工具:
$ xcode-select --install
或者,在https://developer.apple.com/download/more/下载安装。
然后执行:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install wget
完成安装后可以列出已安装内容:
$ brew list
wget
# 显示可以升级的包
$ brew outdated
cmake (3.13.4) < 3.14.0
yarn (1.13.0) < 1.15.2
youtube-dl (2019.03.09) < 2019.03.18
# 进行升级
$ brew upgrade cmake
$ brew uninstall wget
$ brew install google-chrome --cask
对于 Homebrew-cask 管理桌面程序,这里先不细说,后面会专门讲。
Homebrew 会把软件安装到 /usr/local/Cellar
,并且通过软链链接到 /usr/local/bin
。我们可以通过 brew unlink
和 brew link
删除或创建链接。
Homebrew 把软件安装过程中的各种名词都进行了拟物化命名34,这些命名挺有意思,但对于大多数英语水平一般的人来说,有不少词汇有些生僻。
英文 | 直译 | 实际含义 |
---|---|---|
formula(e) | 公式 | 安装包的描述文件,formulae 为复数 |
cellar | 地窖 | 安装好后所在的目录 |
keg | 小桶 | 具体某个包所在的目录,keg 是 cellar 的子目录 |
bottle | 瓶子 | 预先编译好的包,不需要现场下载编译源码,速度会快很多; 官方库中的包大多都是通过 bottle 方式安装 |
tap | (插入)水龙头 | 下载启用某个源 |
cask | 木桶 | 安装 macOS native 应用的扩展 |
bundle | 捆 | 描述 Homebrew 依赖的扩展 |
对于 Homebrew,我们很多时候往往都是上来就brew search
或是brew install
。缺什么安什么,没有充分的应用它的强大能力。
首先,Homebrew 虽为解决控制台程序而生,但它完全有能力(Cask)安装任何桌面软件。它还支持丰富的分类目软件库或第三方库。
除此之外,它还有一个打包安装或备份工具,可以把已安装的软件输出成 Brewfile。迁移到新电脑时,只要根据 Brewfile 运行 Homebrew bundle,就可以一键安装全部控制台、桌面和来自 Mac App Store 的程序(Mac App Store 上的软件通过 mas 支持)。
Tap 在 Homebrew 中我理解是个动词,指的是启用某个源。实际看了下发现,homebrew-services 和 homebrew-bundle 也已 tap 形式存在,因此可以认为 tap 实际指的应该是扩展(extension)。
Homebrew 默认情况下会自带:
后两者并没有任何公式配方,而只是扩展程序。
除此之外的源,需要通过 brew tap
来启用。如:
$ brew tap heroku/brew
$ brew install heroku
Homebrew-services 是 Homebrew 的后台服务程序扩展,它基于 macOS 的 launchctl
。后台服务类程序的安装依旧使用 Homebrew,在管理时可以使用 Homebrew-services 进行启动、重启和停止等操作。
$ brew install mysql
$ brew services start mysql
Homebrew-cask 是 Homebrew 的 macOS Native 应用扩展,通过 cask 可以安装各类应用程序。
搜索 Cask 的方法和搜索普通包一样,但安装时需要加上 cask 指令:
$ brew search google-chrome
$ brew install google-chrome --cask
Homebrew Cask 和 Homebrew 一样,默认库只维护最新版本,但有的时候我们还是需要用旧版的(比如:我只有 Dash 3 的 License,所以需要用 Dash 3 而不是最新的 Dash 4),那就可能需要使用 cask-versions。
$ brew tap homebrew/cask-versions
$ brew install dash3 --cask
Homebrew 官方的字体源,比如 Mozilla 的开源字体 Fira Code:
$ brew tap homebrew/cask-fonts
$ brew install font-fira-code --cask
Homebrew 不仅仅是一个包管理器,还具有软件依赖管理能力。通过 Homebrew Bundle 可以帮你解决所有软件依赖,包括官方和第三方的 formula 以及 cask,甚至还包括 Mac App Store(简称 mas)中的应用。
Homebrew 默认就安装了 Homebrew Bundle。
我们只需要一个Brewfile
,就可以配置好所有需要的应用。熟悉 Ruby 的人应该不太需要解释,毕竟 Ruby 自己就有 Bundler 这套东西,Brewfile 和 Gemfile 属于对应关系。
如果你的安装列表已经足够“干净”,那么可以执行brew bundle dump
来生成现有依赖,输出到Brewfile
:
$ brew bundle dump
$ cat Brewfile
brew "git"
brew "wget"
brew "mas"
brew "p7zip"
...
如果想自己写也比较容易,Brewfile
是一种简单的 Ruby DSL,写起来比大部分配置文件都简单。只需要掌握一些常用到的命令,主要有brew
, tap
, cask
和mas
。
这四条命令分别对应:
brew install
brew tap
brew cask install
mas install
注:mas 也就是之前文章中介绍过的 Mac App Store 命令行工具
命令行类应用:
brew "git"
brew "wget"
brew "vim"
非命令行类:
cask "google-chrome"
cask "alfred"
cask "visual-studio-code"
非官方 Formula 应用:
tap "homebrew/cask-versions"
brew "dash3"
tap "homebrew/cask-fonts"
cask "font-source-code-pro"
Mac App Store 上的应用:
mas "WeChat", id: 836500024
因此,维护好 Brewfile 就可以完美解决应用自动化安装,只需要运行:
brew bundle
创建并提交一个 Formula 比较容易,官方教程非常详细5。这里,我就不做单独介绍了。
Homebrew 除了各种官方维护的源外,还支持自建软件库。默认使用 GitHub,需要以“homebrew-xxx”格式命名 Repo。Formula 或 Cask 文件需要存放在 Formula 或 Casks 二级目录中。
比如,Heroku 的自建库在 GitHub 上是heroku/homebrew-brew
。通过brew tap heroku/brew
就可以获取库里维护的包了。
上面说到,Tap 默认维护在 GitHub,那么当我们想安装一些需要保密的软件时该怎么办呢?
答案是 Tap 支持指定 Git,因此也可以使用内网域名内的 Git:
$ brew tap yourcompany/brew git@git.yourcompany.com:yourcompany/homebrew-brew.git
$ brew install inhouse-app
Homebrew 自动升级触发概率很高,由于网络等问题,检查更新会很久有时会比较烦。可以通过环境变量禁用自动升级:
HOMEBREW_NO_AUTO_UPDATE=1 brew info mysql
Homebrew 的安装指令并非只支持名字,也可以用文件安装包括网络文件和本地文件。
# 本地
$ brew install blabla.rb
# 远程
$ brew install https://blablablabla.com/blabla.rb
Homebrew 默认情况下只支持最新版软件安装,有些重要的版本会单独存在。但想安装一些小版本就得自己 DIY 了。
我所知有两种方法:
brew install
安装。/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
,git checkout
到所在 commit,再用 brew pin
锁定这个文件的更新,然后进行安装。