你应该按期更新 Homebrew

TL;DR

这篇文章是关于按期更新 Homebrew 的话题。它会告诉你按期更新的好处,经常使用的命令,以及用 brew pin 尽量无痛地更新。git

为何要按期更新

我发现很多人都不会常常更新,或者只在必须用某个工具的新版本的时候才更新。他们的见解是,更新有可能产生一些意外的问题,反正当前环境足够稳定能够用,干吗自找麻烦呢?github

这个见解对也不对。对是由于,更新产生的潜在问题不可避免。不对是由于总有一天你须要升级的,也许是为了某个工具的新特性,也许是为了修复软件的漏洞,也许你安装的包非要依赖另外一个包的新版本,等等。若是隔了很长一段时间才升级,那潜在的小问题可能就会变成大问题。数据库

另外一个有意思的现象是,当碰到比较破坏性的事情,好比 Mac OS 大版本更新后,不少人会选择重装 Homebrew 而后顺带安装最新版的包。不多人会去装一个指定的旧版本(除了特殊项目须要)。这说明他们不是不想用新版本,而是不想痛苦地更新。缓存

既然总有一天须要更新,而更新带来问题不可避免,那为何不更新得频繁点呢?这个道理跟 Git 的冲突解决有类似性。长时间不 pull/push 的代码更容易产生冲突,一个解决方法就是频繁地 commit & merge 。安全

我如今试着一个月更新一次,两次下来发现这些好处:bash

  1. 每次更新的包不多,更新风险也小。工具

  2. 更容易发现不须要的包,便于清理,不为不须要的东西买单。ui

  3. 按期清理旧版本,释放空间。code

更新流程其实都差很少,下面列一下我经常使用的命令。orm

更新 Homebrew

要获取最新的包的列表,首先得更新 Homebrew 本身。这能够用 brew update 办到。

brew update

完后会显示能够更新的包列表,其中打钩的是已经安装的包。输出相似下面这样:

Updated Homebrew from fe93aa3 to 6ae64c3.
Updated 1 tap (homebrew/versions).
==> Updated Formulae
awscli      cmake ✔     homebrew/versions/libmongoclient-legacy

更新包 (formula)

更新以前,我会用 brew outdated 查看哪些包能够更新。

brew outdated

而后就能够用 brew upgrade 去更新了。Homebrew 会安装新版本的包,但旧版本仍然会保留。

brew upgrade             # 更新全部的包
brew upgrade $FORMULA    # 更新指定的包

清理旧版本

通常状况下,新版本安装了,旧版本就不须要了。我会用 brew cleanup 清理旧版本和缓存文件。Homebrew 只会清除比当前安装的包更老的版本,因此不用担忧有些包没更新但被删了。

brew cleanup             # 清理全部包的旧版本
brew cleanup $FORMULA    # 清理指定包的旧版本
brew cleanup -n          # 查看可清理的旧版本包,不执行实际操做

这样一套下来,该更新的都更新了,旧版本也被清理了。

锁定不想更新的包

若是常常更新的话,brew update 一次更新全部的包是很是方便的。但咱们有时候会担忧自动升级把一些不但愿更新的包更新了。数据库就属于这一类,尤为是 PostgreSQL 跨 minor 版本升级都要迁移数据库的。咱们更但愿找个时间单独处理它。这时可用 brew pin 去锁定这个包,而后 brew update 就会略过它了。

brew pin $FORMULA      # 锁定某个包
brew unpin $FORMULA    # 取消锁定

其余几个经常使用命令

brew info 能够查看包的相关信息,最有用的应该是包依赖和相应的命令。好比 Nginx 会提醒你怎么加 launchctl ,PostgreSQL 会告诉你如何迁移数据库。这些信息会在包安装完成后自动显示,若是忘了的话能够用这个命令很方便地查看。

brew info $FORMULA    # 显示某个包的信息
brew info             # 显示安装了包数量,文件数量,和总占用空间

brew deps 能够显示包的依赖关系,我经常使用它来查看已安装的包的依赖,而后判断哪些包是能够安全删除的。

brew deps --installed --tree    # 查看已安装的包的依赖,树形显示

输出以下:

elixir (required dependencies)
└── :erlang

wxmac (required dependencies)
├── jpeg
├── libpng
│   └── xz
└── libtiff
    └── jpeg

还有不少有用的命令和参数,没事 man brew 一下能够涨很多知识。

小结

不想更新 Homebrew 每每有两个缘由,惧怕潜在的风险和对工具的不熟悉,我以前也是这样。写这篇文章最开始是为了帮我记录经常使用的命令方便之后查阅的。但愿它也能帮到你。

参考资料

Keeping Your Homebrew Up to Date
Homebrew FAQ

相关文章
相关标签/搜索