前言

本来想着 macOS 使用 Homebrew 对大家没啥难度,之前就分享了一篇介绍 homebrew-bundle 备份恢复的文章,不过长期使用后还是觉得有必要做一下总结,道理也很简单,越简单越频繁使用的产品就越值得挖掘一些背自己忽视的小技巧,因为如果可以做到每天节省 5 分钟那么量变可能会成为质变。

更新历史

2019 年 09 月 11 日 - 更新转载 Homebrew 深度应用
2019 年 09 月 08 日 - 初稿

阅读原文 - https://wsgzao.github.io/post/homebrew/

扩展阅读

Homebrew

macOS 使用 homebrew-bundle 优雅的备份和恢复软件列表


Homebrew 简介

Homebrew 是一款享有盛名的包管理工具,是 macOS 上包管理的事实 (de facto) 标准 。Homebrew 的意思是家酿啤酒。

它的官方 slogan 是 The missing package manager for macOS (or Linux)。Linuxbrew 已经在 Homebrew 1.9 正式合入,成为 Homebrew 的 “一等公民”。

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.

为什么需要 Homebrew

对于使用 Unix/Linux 类系统的用户往往都遇到过这些需求:

  • 开源程序是源码分发,需要自己编译,但 ./configure 参数超多,还要解决各种库的依赖
  • 想把软件安装到用户目录,而不是系统目录(这样不需要 root 权限)
  • 自己编译安装了软件,想删除时却不知道在哪里删除和删除哪些文件

各 Linux 发行版为了提升安装软件的体验,大多都提供了官方的包管理器,如 Ubuntu 的 aptitude (apt-get)。而苹果官方没有为 macOS 提供包管理器,市面上最好的解决方案就是 Homebrew。

目前 Homebrew 的中文内容大多以简单入门级教程为主,对于它的各类能力提之甚少,我希望在这里更全面的分享 Homebrew。

Homebrew 快速入门

网上基础的教程很多,我这里只简略的介绍下。对于基础功能类的深度用法,推荐这篇 macOS 包管理工具 Homebrew 不完全指南

Homebrew 安装

安装

开始安装前需要安装 macOS 命令行工具:

1
xcode-select —install

或者,在 https://developer.apple.com/download/more/ 下载安装。

然后执行:

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

基础功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装 
brew install wget

# 完成安装后可以列出已安装内容
brew list

# 显示可以升级的包
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 cask install google-chrome

对于 Homebrew-cask 管理桌面程序,这里先不细说,后面会专门讲。

Homebrew 会把软件安装到 /usr/local/Cellar,并且通过软链链接到 /usr/local/bin。我们可以通过 brew unlinkbrew link 删除或创建链接。

名词解释

Homebrew 把软件安装过程中的各种名词都进行了拟物化命名,这些命名挺有意思,但对于大多数英语水平一般的人来说,有不少词汇有些生僻。

英文 直译 实际含义
formula(e) 公式 安装包的描述文件,formulae 为复数
cellar 地窖 安装好后所在的目录
keg 小桶 具体某个包所在的目录,keg 是 cellar 的子目录
bottle 瓶子 预先编译好的包,不需要现场下载编译源码,速度会快很多;官方库中的包大多都是通过 bottle 方式安装
tap (插入) 水龙头 下载启用某个源
cask 木桶 安装 macOS native 应用的扩展
bundle 描述 Homebrew 依赖的扩展

Homebrew 进阶用法

对于 Homebrew,我们很多时候往往都是上来就 brew search 或是 brew install。缺什么安什么,没有充分的应用它的强大能力。

首先,Homebrew 虽为解决控制台程序而生,但它完全有能力(Cask)安装任何桌面软件。它还支持丰富的分类目软件库或第三方库。

除此之外,它还有一个打包安装或备份工具,可以把已安装的软件输出成 Brewfile。迁移到新电脑时,只要根据 Brewfile 运行 Homebrew bundle,就可以一键安装全部控制台、桌面和来自 Mac App Store 的程序(Mac App Store 上的软件通过 mas 支持)。

Tap

Tap 在 Homebrew 中我理解是个动词,指的是启用某个源。实际看了下发现,homebrew-services 和 homebrew-bundle 也已 tap 形式存在,因此可以认为 tap 实际指的应该是扩展(extension)。

Homebrew 默认情况下会自带:

  • homebrew/core
  • homebrew/cask
  • homebrew/services
  • homebrew/bundle

后两者并没有任何公式配方,而只是扩展程序。

除此之外的源,需要通过 brew tap 来启用。如:

1
2
brew tap heroku/brew
brew install heroku

Services

Homebrew-services 是 Homebrew 的后台服务程序扩展,它基于 macOS 的 launchctl。后台服务类程序的安装依旧使用 Homebrew,在管理时可以使用 Homebrew-services 进行启动、重启和停止等操作。

1
2
brew install mysql
brew services start mysql

Cask

Homebrew-cask 是 Homebrew 的 macOS Native 应用扩展,通过 cask 可以安装各类应用程序。

搜索 Cask 的方法和搜索普通包一样,但安装时需要加上 cask 指令:

1
2
brew search google-chrome
brew cask install google-chrome

cask-versions

Homebrew Cask 和 Homebrew 一样,默认库只维护最新版本,但有的时候我们还是需要用旧版的(比如:我只有 Dash 3 的 License,所以需要用 Dash 3 而不是最新的 Dash 4),那就可能需要使用 cask-versions。

1
2
brew tap homebrew/cask-versions
brew cask install dash3

cask-fonts

Homebrew 官方的字体源,比如 Mozilla 的开源字体 Fira Code:

1
2
brew tap homebrew/cask-fonts
brew cask install font-fira-code

Bundle

Homebrew 不仅仅是一个包管理器,还具有软件依赖管理能力。通过 Homebrew Bundle 可以帮你解决所有软件依赖,包括官方和第三方的 formula 以及 cask,甚至还包括 Mac App Store(简称 mas)中的应用。

Homebrew 默认就安装了 Homebrew Bundle。

我们只需要一个 Brewfile,就可以配置好所有需要的应用。熟悉 Ruby 的人应该不太需要解释,毕竟 Ruby 自己就有 Bundler 这套东西,Brewfile 和 Gemfile 属于对应关系。

如果你的安装列表已经足够 “干净”,那么可以执行 brew bundle dump 来生成现有依赖,输出到 Brewfile

1
2
3
4
5
6
7
8
brew bundle dump
cat Brewfile

brew "git"
brew "wget"
brew "mas"
brew "p7zip"
...

如果想自己写也比较容易,Brewfile 是一种简单的 Ruby DSL,写起来比大部分配置文件都简单。只需要掌握一些常用到的命令,主要有 brew, tap, caskmas

这四条命令分别对应:

  • brew install
  • brew tap
  • brew cask install
  • mas install

注:Homebrew 虽然好用,但 Homebrew 并不能管理 MAS「Mac App Store」上的应用软件,在终端上轻松管理「Mac App Store」中应用的神器 mas-cli

命令行类应用:

1
2
3
brew "git"
brew "wget"
brew "vim"

非命令行类:

1
2
3
cask "google-chrome"
cask "alfred"
cask "visual-studio-code"

非官方 Formula 应用:

1
2
3
4
tap  "homebrew/cask-versions"
brew "dash3"
tap "homebrew/cask-fonts"
cask "font-source-code-pro"

Mac App Store 上的应用:

1
mas "WeChat", id: 836500024

因此,维护好 Brewfile 就可以完美解决应用自动化安装,只需要运行:

1
brew bundle

Homebrew 扩展用法

提交 Formula

创建并提交一个 Formula 比较容易,官方教程非常详细。这里,我就不做单独介绍了。

自建 Tap

Homebrew 除了各种官方维护的源外,还支持自建软件库。默认使用 GitHub,需要以 “homebrew-xxx” 格式命名 Repo。Formula 或 Cask 文件需要存放在 Formula 或 Casks 二级目录中。

比如,Heroku 的自建库在 GitHub 上是 heroku/homebrew-brew。通过 brew tap heroku/brew 就可以获取库里维护的包了。

私有 Tap

上面说到,Tap 默认维护在 GitHub,那么当我们想安装一些需要 保密 的软件时该怎么办呢?

答案是 Tap 支持指定 Git,因此也可以使用内网域名内的 Git:

1
2
brew tap yourcompany/brew git@git.yourcompany.com: yourcompany/homebrew-brew.git
brew install inhouse-app

Homebrew Tips

禁用自动升级

Homebrew 自动升级触发概率很高,由于网络等问题,检查更新会很久有时会比较烦。可以通过环境变量禁用自动升级:

1
HOMEBREW_NO_AUTO_UPDATE=1 brew info mysql

直接安装 Formula

Homebrew 的安装指令并非只支持名字,也可以用文件安装包括网络文件和本地文件。

1
2
3
4
# 本地 
brew install blabla.rb
# 远程
brew install https://blablablabla.com/blabla.rb

安装旧版软件

Homebrew 默认情况下只支持最新版软件安装,有些重要的版本会单独存在。但想安装一些小版本就得自己 DIY 了。

我所知有两种方法:

  1. 在 GitHub 找到 Formula 所在 Repo 中(默认为 homebrew-core)的文件,把文件远程地址复制下来,用 brew install 安装。
  2. 进入 homebrew-core 在 macOS 本地的路径,默认为 /usr/local/Homebrew/Library/Taps/homebrew/homebrew-coregit checkout 到所在 commit,再用 brew pin 锁定这个文件的更新,然后进行安装。

Homebrew 常见问题

我遇到的问题大多数是升级 macOS Mojave 之后产生的,升级前要三思而后行,先备份,先备份,先备份

Homebrew Permissions Denied Issues Solution

sudo chown -R $(whoami) $(brew --prefix)/*

Reference - https://gist.github.com/irazasyed/7732946

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun.

Reference - https://apple.stackexchange.com/questions/254380/why-am-i-getting-an-invalid-active-developer-path-when-attempting-to-use-git-a

1
2
3
4
5
6
7
8
# The problem is that you are using XCode and you explicit have to agree to the license agreement. So open Terminal, and run the following:

xcode-select --install

# This will download and install xcode developer tools and fix the problem. As a follow on step, you may need to reset the path to Xcode if you have several versions or want the command line tools to run without Xcode.

xcode-select --switch /Applications/Xcode.app
xcode-select --switch /Library/Developer/CommandLineTools

Homebrew 国内加速镜像

Homebrew 清华大学镜像使用帮助

加速一切 - 配置国内镜像 - Linux apt/macOS brew/Docker/Python Conda/Maven

参考文章

Max Howell on Twitter: “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.”

https://github.com/Linuxbrew/brew/issues/612

Formula Cookbook — Homebrew Documentation

Glossary of Homebrew Terms

Formula Cookbook — Homebrew Documentation

在终端上轻松管理「Mac App Store」中应用的神器 mas-cli

Homebrew 深度应用

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. Homebrew 简介
  4. 4. 为什么需要 Homebrew
  5. 5. Homebrew 快速入门
    1. 5.1. Homebrew 安装
    2. 5.2. 安装
    3. 5.3. 基础功能
    4. 5.4. 名词解释
  6. 6. Homebrew 进阶用法
    1. 6.1. Tap
    2. 6.2. Services
    3. 6.3. Cask
    4. 6.4. Bundle
  7. 7. Homebrew 扩展用法
    1. 7.1. 提交 Formula
    2. 7.2. 自建 Tap
    3. 7.3. 私有 Tap
  8. 8. Homebrew Tips
    1. 8.1. 禁用自动升级
    2. 8.2. 直接安装 Formula
  9. 9. 安装旧版软件
  10. 10. Homebrew 常见问题
  11. 11. 参考文章