如何在 Mac 中优雅地使用 brew 安装软件包

Homebrew 是 Mac 系统中常用的软件包管理工具, 这里的软件包更多的是指命令行工具, 比如 tree, wget 等. 苹果官方只有 Apple Store 提供的图形化软件, 而对于这些命令行工具, 官方没有提供一个统一的管理工具, 正如 Homebrew 官方网站 所说: The missing package manager for macOS.

基础知识

  • /usr/local/bin/brew 命令路径
  • /usr/local/Cellar 用户安装路径
  • brew --repo brew 代码库
  • brew --cache 下载的 package 的存放路径
  • brew install <Formula> 安装软件包
  • brew list 查看本机已安装的软件包

用国内镜像源安装

按照官方给出的安装方法如下

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

如果你真的执行上述命令, 会发现安装过程非常缓慢 (在国内). 自然的想法是, 找国内代理, 这里推荐清华大学提供的镜像.

修改默认的安装方式. 官方提供的安装命令实际上分为两个部分, 第一部分, 下载 install 安装脚本; 第二部分, 执行该安装脚本.

首先, 下载安装脚本保存为 install_brew.rb.

curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install > install_brew.rb

修改如下两行, 指向镜像源

BREW_REPO = "https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew".freeze
CORE_TAP_REPO = "https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core".freeze

然后, 执行安装脚本. (-e 指的是后面跟的一条命令, 因此这里不需要了)

ruby install_brew.rb

这样就大功告成了.

替换为国内镜像源

如果是已经安装好了 brew, 但在用 brew 安装软件包时, 发现安装缓慢, 此时想要替换为国内镜像源, 请直接参考清华大学提供的镜像提示.

取消自动更新

利用 brew 安装软件包时, 每次总会先执行 Updating Homebrew..., 速度很慢, 可以设置如下环境变量.

export HOMEBREW_NO_AUTO_UPDATE=true

详情参见取消brew的自动更新. 如果确实想要更新 Homebrew, 可以手动执行

brew update

安装老的软件版本

如果上一节中的自动更新开启了, 那么每次用 brew install <formula> 命令安装软件包时, 都会安装当前 <formula> 的最新版本, 但在实际工作中, 服务器上的软件包版本往往不是最新的, 为了保持一致, 本地应尽量安装相同的版本, 至少保证大版本号一致.

安装 MySQL 5.7

当前 MySQL 最新版本为 8.0, 那么如何安装 5.7 版本呢?

$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ cd Formula
$ ls mysql*
mysql++.rb              mysql-sandbox.rb        mysql@5.6.rb
mysql-client.rb         mysql-search-replace.rb mysql@5.7.rb
mysql-cluster.rb        mysql-utilities.rb      mysqltuner.rb
mysql-connector-c++.rb  mysql.rb
mysql-connector-c.rb    mysql@5.5.rb

正好有 mysql@5.7.rb Formula, 那么执行如下命令即可 (需要根据提示安装将命令加入 PATH 环境变量)

brew install mysql@5.7

安装 Python 2

同上, 执行如下命令

brew install python@2

安装 Python 3.6

当前 Python 最新版本为 3.7, 由于有些 Python 包还没有推出适合的版本, 比如 tensorflow, 会报如下错误, 找不到匹配的版本.

$ pip3 -V
pip 10.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
$ pip3 install tensorflow
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Collecting tensorflow
  Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow

我们需要将 homebrew-coreFormula/python.rb 文件, 回滚到 3.6 时的版本, 可按如下方式操作. 注意: 如下方式操作之前必须取消自动更新, 方法参见前面的例子.

$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git log -- Formula/python.rb
<== 省略 ==>
commit e23247ec179ba32f277857e89b7ae8e70b3e177c
Author: Aleks Bunin <github@compuix.com>
Date:   Wed Jun 27 19:55:02 2018 -0400

    python 3.7.0

commit f2a764ef944b1080be64bd88dca9a1d80130c558
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Sun Jun 17 13:24:46 2018 +0000

    python: update 3.6.5_1 bottle.
<== 省略 ==>

从上面的输出看到, f2a764e 版本是正好对应 python 3.6, 这就是我们需要版本, 先回滚代码, 然后完成安装.

git reset --hard f2a764ef944b1080be64bd88dca9a1d80130c558
brew install python

安装 thrift 0.11.0

当前 thrift 最新版本为 0.12.0, 很多公司可能还在用比较老的版本, 比如我司之前还在用 0.10.0, 最近升级到了 0.11.0. 如何安装需要的版本呢? 当然可以按前面安装 Python 3.6 的方式, 这里提供一种懒人方式.

brew unlink thrift # 如果安装了别的版本, 可能需要先卸载
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/a1d5a1e87bccf56b741a1276f0b305baadca0e16/Formula/thrift.rb

这里的 commit id 获取方式同上面.

$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git log -- Formula/thrift.rb
<== 省略 ==>
commit 2a11925d90d50b37a7b3ced8c64d211392c82a19
Author: Taras <9948629+Trane9991@users.noreply.github.com>
Date:   Tue Jan 8 12:35:00 2019 +0200

    thrift 0.12.0

commit a1d5a1e87bccf56b741a1276f0b305baadca0e16
Author: FX Coudert <fxcoudert@gmail.com>
Date:   Mon Jan 28 20:13:01 2019 +0100

    thrift: remove pre-Mavericks support
<== 省略 ==>

参考文献