這篇文章是關於按期更新 Homebrew 的話題。它會告訴你按期更新的好處,經常使用的命令,以及用 brew pin
儘量無痛地更新。git
我發現很多人都不會常常更新,或者只在必須用某個工具的新版本的時候才更新。他們的見解是,更新有可能產生一些意外的問題,反正當前環境足夠穩定能夠用,幹嗎自找麻煩呢?github
這個見解對也不對。對是由於,更新產生的潛在問題不可避免。不對是由於總有一天你須要升級的,也許是爲了某個工具的新特性,也許是爲了修復軟件的漏洞,也許你安裝的包非要依賴另外一個包的新版本,等等。若是隔了很長一段時間才升級,那潛在的小問題可能就會變成大問題。數據庫
另外一個有意思的現象是,當碰到比較破壞性的事情,好比 Mac OS 大版本更新後,不少人會選擇重裝 Homebrew 而後順帶安裝最新版的包。不多人會去裝一個指定的舊版本(除了特殊項目須要)。這說明他們不是不想用新版本,而是不想痛苦地更新。緩存
既然總有一天須要更新,而更新帶來問題不可避免,那爲何不更新得頻繁點呢?這個道理跟 Git 的衝突解決有類似性。長時間不 pull/push 的代碼更容易產生衝突,一個解決方法就是頻繁地 commit & merge 。安全
我如今試着一個月更新一次,兩次下來發現這些好處:bash
每次更新的包不多,更新風險也小。工具
更容易發現不須要的包,便於清理,不爲不須要的東西買單。ui
按期清理舊版本,釋放空間。code
更新流程其實都差很少,下面列一下我經常使用的命令。orm
要獲取最新的包的列表,首先得更新 Homebrew 本身。這能夠用 brew update
辦到。
brew update
完後會顯示能夠更新的包列表,其中打鉤的是已經安裝的包。輸出相似下面這樣:
Updated Homebrew from fe93aa3 to 6ae64c3. Updated 1 tap (homebrew/versions). ==> Updated Formulae awscli cmake ✔ homebrew/versions/libmongoclient-legacy
更新以前,我會用 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 每每有兩個緣由,懼怕潛在的風險和對工具的不熟悉,我以前也是這樣。寫這篇文章最開始是爲了幫我記錄經常使用的命令方便之後查閱的。但願它也能幫到你。