跳至主要內容
技術

Homebrew 6.0 來了:先搞懂這幾個會影響你日常的改動

Homebrew 6.0 來了:先搞懂這幾個會影響你日常的改動

如果你是 Mac 開發者,brew 大概是你每天最早敲下的幾個指令之一。所以當它跳上 6.0 這個大版號時,值得花十分鐘搞清楚發生了什麼事——因為大版號意味著 breaking change,而這次有幾個改動,是你「下一次 brew install 就會直接撞到」的那種。

先給結論:6.0 的重點,是把你每天在用的 brew 變得更安全、也更快——不是塞一堆新功能,而是把基本功做扎實。而你會直接撞到的,是這三件事——

  1. 把供應鏈安全收緊:第三方 tap 不再「裝了就跑」。
  2. 改掉你每天的操作習慣brew install 現在會先問你一句。
  3. 開始跟 Intel Mac 道別:x86_64 進入退場時間表。

剩下的都是錦上添花。下面一個一個看。

brew install 之後,它現在會先問你一句

這是你最快會注意到的改動。以前 brew install something 按下 enter,它就一路裝到底。6.0 開始,對開發者預設開啟「ask 模式」:你敲下指令後,它不會立刻動手,而是先列出這次會連帶安裝或升級哪些相依套件,停下來等你回一個 Y。升級時如果沒有東西需要動,它也夠聰明、不會多問。

官方說這是照使用者問卷做的決定——大家其實想在「它要對我的系統做什麼」之前,有個喊停的機會。

實務上唯一要注意的是 CI。你的 pipeline 裡如果有 brew install,多了一個互動式確認就會直接卡住。兩個解法:

# 本機:這次不要問
brew install -y wget          # 或寫成 --no-ask

# CI:整個環境都別問
export HOMEBREW_NO_ASK=1

NOTE

-y / --no-ask 是「這次不要問」,HOMEBREW_NO_ASK 是「整個環境都別問」。本機留著 ask 模式其實很好用(避免手滑裝錯、被拖一大串相依套件下來),但 CI 記得設環境變數。

第三方 tap 不再「裝了就跑」:Tap 信任機制

這是 6.0 真正的頭條,也是最值得花時間理解的一個。

先講清楚問題:一個第三方 tap(brew tap user/repo 那種)本質上是一包會在你機器上、用你的權限、不經沙箱執行的 Ruby 程式碼。你 brew install 它底下的某個 formula,等於同意跑它的安裝腳本。過去這件事是默默發生的——這也正是為什麼近期會出現「把惡意程式碼塞進 tap」這類攻擊。

6.0 把這個洞補起來:第三方 tap(以及它底下的 formula、cask、外部指令)現在必須先被你明確信任,Homebrew 才會去 evaluate 它的程式碼。 官方的 Homebrew taps 和內建指令一律預設信任,所以你日常的 brew install wget 完全不受影響。

要信任有兩種做法:

# 做法一(推薦):只信任你真正要的那一個
# 用「完整路徑名」安裝,就只信任這一項
brew install user/repo/formula
brew install --cask user/repo/cask

# 做法二:信任整個 tap(連它之後新增的東西也一起放行)
brew trust user/repo

「做法一」的範圍最小,是官方建議的預設姿勢——你要哪個就信任哪個,而不是把整個 tap 未來會長出來的所有東西,現在就先簽下去。

過渡期如果你被擋住、或 CI 整批爆掉,有一個暫時的逃生門:

export HOMEBREW_NO_REQUIRE_TAP_TRUST=1

但官方講得很白:這只是過渡用的,最終會強制。所以正解是把你常用的幾個 tap 一次信任好,而不是長期靠這個環境變數繞過。

WARNING

如果你的 CI 在升上 6.0 之後突然變紅,第一個要懷疑的就是這裡——brew doctor 的 untrusted-tap 檢查、或第三方 tap 的 formula 載入被擋下。先盤點 pipeline 裡用到哪些非官方 tap,把它們補上 trust。

brew exec:Homebrew 版的 npx

如果你寫過 Node,一定用過 npx——不想把工具裝進全域,臨時拉下來跑一次就好。6.0 給了 Homebrew 一個對應的東西:brew exec(縮寫 brew x)。

它的用法是:指定這次需要哪些 formula,Homebrew 幫你(必要時)裝好、把它們和相依套件的執行檔目錄塞進 PATH,然後跑你的指令:

# 臨時用 jq + yq 跑一個腳本,不用先全域安裝
brew exec --formulae=jq,yq -- ./script.sh

對「我只是想跑個一次性腳本、不想污染環境」這種情境很實用,尤其是寫教學、寫 Makefile、或想在乾淨環境裡驗證相依關係的時候。

brew vulns:順手掃一下裝了什麼有洞的東西

延續這版的資安主軸,6.0 還多了 brew vulns:拿你「已經安裝」的套件去比對已知漏洞,告訴你哪些東西該升級了。

過去你大概得靠額外工具、或自己留意 CVE,現在 Homebrew 本身就能給你一張清單。詳細選項可以用 brew vulns --help 看,但概念很單純——把「你裝了什麼」和「哪些版本有已知問題」對起來,是個值得偶爾跑一次的習慣。

這版整體變快了

6.0 把幾個原本是選用的加速項目轉成預設:

  • 內建 JSON API 變預設:把套件 metadata 合併成單次下載,少了一堆零碎的網路請求,啟動更快。(舊的 HOMEBREW_USE_INTERNAL_API 環境變數也因此功成身退、被標記棄用。)
  • brew leaves 快了約 30%:就是列出你「手動裝、且沒被其他套件依賴」的那個指令。
  • 平行化:升級時平行抓 bottle 的 tab、brew bundle 預設平行安裝 formula。

這些都不用你動手,升上去就有。

Intel Mac 的倒數計時開始了

如果你還在用 Intel(x86_64)的 Mac,這段一定要看。官方公布了明確的退場時間表:

時間x86_64 macOS 的狀態
2026 年 9 月降到 Tier 3:不再跑 CI、不再產新的 bottle
2027 年 9 月完全不支援,相關程式碼整批移除

白話講:今年九月之後,Intel Mac 上不少套件會開始沒有預編譯好的 bottle,得自己從原始碼編(慢,又容易踩雷);明年九月之後就完全不在支援範圍內了。手上還有 Intel 機器在當生產力主力的人,這一年就是你規劃遷移的窗口。

同一批 OS 相關更新還包括:

  • macOS 27(Golden Gate) 初步支援上線(同時這版也是放掉 Intel 的版本)。
  • 認得 M5、M5 Pro/Max 晶片。
  • WSL 體驗改善(brew config 會顯示 Windows build)。

其他順手知道就好的改動

不是每個人都會用到,但掃一眼留個印象:

  • Cask 現在可以 pin:把某個 GUI app 釘在特定版本,不讓它被升級。
  • Install Steps 框架:把常見的安裝步驟(建目錄、搬檔案、建 symlink)改成「純資料、不需要在安裝當下跑 Ruby」的描述——又是一個縮小安全暴露面的設計。
  • 下載冷卻(download cooldowns):對 Bundler、RubyGems、npm、pip、PyPI 加了節流,降低供應端被濫用的風險。
  • brew bundle 變強:新增 npmkrewwinget(Windows)支援,cleanup 也能一起管 npm/cargo/go/uv。
  • Services:可以啟動 systemd timer、自動建好 service 需要的目錄。

要現在升級嗎?怎麼升

要。這版的安全改動是實打實有意義的,加速也是免費送的。升級照舊:

brew update
brew upgrade

升完之後,給自己三個提醒:

  1. CI 會不會被卡:ask 模式 → 設 HOMEBREW_NO_ASK=1;第三方 tap → 補 brew trust,別長期靠 HOMEBREW_NO_REQUIRE_TAP_TRUST 繞過。
  2. 盤點你的非官方 tap:花五分鐘把常用的幾個一次信任好,之後就順了。
  3. Intel 使用者排遷移:把「九月前」放進行事曆。

一句話總結:Homebrew 6.0 沒有給你新玩具,但它讓「你每天都在用的這個工具」更安全、更快,也更願意在動手前先問你一句。對天天 brew 的人來說,這種版本反而最值得認真升。


資料來源:Homebrew 6.0.0 官方公告Homebrew Tap-Trust 文件Homebrew Manpage

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →