蘋果M1 Mac上怎樣使用Homebrew?

ankych發表於2020-12-11

Homebrew 是 Mac 上管理軟體包的最實用工具之一。Homebrew是一款Mac OS平臺下的軟體包管理工具,擁有安裝、解除安裝、更新、檢視、搜尋等很多實用的功能。簡單的一條指令,就可以實現包管理,而不用你關心各種依賴和檔案路徑的情況,十分方便快捷。

蘋果M1 Mac上怎樣使用Homebrew?

但截至目前,它還沒有對搭載 Apple silicon 的新 Mac 機型完成適配。根據維護者在 GitHub 上釋出的說明,Homebrew 正在積極適配新架構的過程中,但目前還面臨一些較大障礙,如缺少基於 ARM 架構的持續整合框架、很多軟體包依賴的框架或編譯器(go、gcc、qt)未適配等。

Homebrew 目前在新 Mac 上仍然是可用的,並且已經發布了原生支援 ARM 架構的實驗性版本。

1. 安裝 ARM 版 Homebrew

根據官方規劃,ARM 版 Homebrew 必須安裝在  /opt/homebrew 路徑下,而非此前的  /usr/local/Homebrew。由於官方的安裝指令碼還未更新,可以透過如下命令手動安裝:

cd /opt # 切換到 /opt 目錄
mkdir homebrew # 建立 homebrew 目錄
curl -L | tar xz --strip 1 -C homebrew

(注: 如果安裝和使用過程中報錯,可能是因為當前使用者對於  /opt/homebrew 路徑沒有許可權。對此,可以透過  sudo chown -R $(whoami) /opt/homebrew 接管該目錄。)

雖然上面的步驟已經安裝了 ARM 版 Homebrew,但此時在終端中執行 brew 命令並不能直接啟動該版本。這是因為預設情況下,ARM 版 Homebrew 用來安裝程式的路徑 /opt/homebrew/bin 並不在環境變數 PATH 中,因此終端無法檢索到該路徑下的 brew 程式。

為此,編輯配置檔案 ~/.zshrc,加入如下內容:

path=('/opt/homebrew/bin' $path)
export PATH

(注:建議使用者使用 macOS Big Sur 的預設終端 zsh,如使用 bash 或 fish,則修改 ~/.bashrc 或 ~/.config/fish/config.fish,後同。)

然後重新啟動終端。這樣,直接執行 brew 就可以啟動 ARM 版的 Homebrew 了。

2. 安裝 X86 版 Homebrew

如上所述,由於很多軟體包目前還沒有適配 ARM 架構(可以在 Homebrew 的 Apple silicon issue 頁面查詢),無法透過 ARM 版 Homebrew 安裝,因此我們還需要安裝一份 X86 版的 Homebrew 備用。

X86 版 Homebrew 無法在 ARM 環境下安裝。為此,需要先啟動一個 X86 環境的終端。網路上傳播較廣的方法是建立一個 Terminal.app 的副本,然後令其在 Rosetta 相容模式下執行。

其實,注意到在任何命令前增加  arch -x86_64,就可以以 X86 模式執行該命令。因此,執行:

arch -x86_64 $SHELL

就可以啟動一個 X86 模式終端,使得之後執行的命令都在 X86 模式下執行。

此時,執行 Homebrew 的官方安裝指令碼

/bin/bash -c "$(curl -fsSL )"

就可以完成 X86 版 Homebrew 的安裝。

3. ARM 和 X86 版 Homebrew 的共存問題

經過上面的步驟,系統中目前有了兩個 brew 程式,即 X86 版的  /usr/local/bin/brew 和 ARM 版的  /opt/homebrew/bin/brew。那麼,當在終端中執行 brew 命令時,系統會以哪個為準呢?

當存在重名程式時,終端會按照重名程式在環境變數 PATH 中的先後順序選擇要執行的版本。由於之前配置 ~/.zshrc 時,將 ARM 版 Homebrew 的路徑放在了 PATH 的最前面,因此執行 brew 時,位於  /opt/homebrew/bin/brew 的 ARM 版將被優先執行。如果要執行 X86 版,則需要手動輸入完整路徑  arch -x86_64 /usr/local/bin/brew

如果覺得輸入這麼長的命令過於麻煩,可以在 ~/.zshrc 中為兩個版本分別設定簡稱(alias):

abrew='/opt/homebrew/bin/brew' # ARM Homebrew
ibrew='arch -x86_64 /usr/local/bin/brew' # X86 Homebrew

這樣,執行  abrew install  就可以呼叫 ARM 版 Homebrew 安裝軟體包,執行  ibrew install  就可以呼叫 X86 版,從而不容易混淆。

至於應該使用哪個版本的 Homebrew 安裝軟體包,需要區別考慮:

  • 對於命令列(CLI)程式:可以優先嚐試使用 ARM 版 Homebrew 安裝,保證獲得針對新架構編譯的版本,實現最佳的執行效果。但注意:
    • 有的軟體包已經相容新架構、但還沒有釋出相應的編譯版,需要安裝的過程中在本地編譯,耗時會相對很長;
    • 如果軟體包還沒有相容新架構,使用 ARM 版 Homebrew 安裝會報錯,此時可以換用 X86 版 Homebrew 安裝。
  • 對於圖形介面(GUI)程式,即透過 Homebrew Cask 安裝的 .app 程式:對於這類軟體,Homebrew 起的作用只是從官方渠道下載這些軟體的安裝包,然後安裝到 /Applications 路徑(及執行安裝指令碼,如果有)。因此無論其是否針對新架構最佳化,透過任一版本 Homebrew 都可以安裝。考慮到日後維護方便,建議直接用 ARM 版 Homebrew 安裝即可。

4. 從舊 Mac(或 X86 版 Homebrew)遷移軟體包

如果你在拿到 M1 版 Mac 以後,選擇了從舊 Mac 遷移資料、或恢復 Time Machine 備份,那麼系統中可能已經有了遺留的 X86 版 Homebrew 和用它安裝的軟體包。此外,你可能也希望將以往慣用的軟體包無遺漏地遷移到新 Mac。這些情況下,可以使用 Homebrew Bundle 功能輔助遷移工作。

要匯出使用 X86 版 Homebrew 安裝的軟體包列表,執行:

/usr/local/bin/brew bundle dump

就能在當前目錄下得到一個名為 Brewfile 的備份檔案。該檔案可以用普通文字編輯器開啟,列舉了所有已安裝軟體包、新增的第三方軟體源(tap)、Homebrew Cask 管理的 GUI 程式和 mas-cli 管理的 Mac App Store 程式:

tap "homebrew/bundle"
tap "homebrew/cask"
[…]
brew "dash"
brew "ffmpeg"
[…]
cask "bartender"
cask "bettertouchtool"
[…]
mas "Apple Configurator 2", id: 1037126344
mas "Aviary", id: 1522043420
[…]

記下 Brewfile 的路徑。然後,使用 ARM 版 Homebrew 匯入其內容並安裝:

/opt/homebrew/bin/brew bundle --file /path/to/Brewfile

就完成了遷移。

需要注意的是,如果你是在同一臺機器的兩版 Homebrew 間遷移,那麼並不需要遷移透過 Homebrew Cask 和 App Store 安裝的 GUI 程式(Homebrew 也不會允許覆蓋安裝)。這時,可以手動編輯上述 Brewfile,將以 cask 和 mas 開頭的記錄刪除,然後再透過 brew bundle 匯入。

如果想讓 ARM 版 Homebrew 接管已經安裝的 Homebrew Cask 軟體,只要將位於  /usr/local/Caskroom 下的各資料夾移動到  /opt/homebrew/Caskroom 即可:

mv /usr/local/Caskroom/* /opt/homebrew/Caskroom

5.Homebrew 可以透過 Rosetta 2 轉換的方式進行安裝

方法很簡單,只需在過去的安裝命令前加上 arch -x86_64 即可

$arch -x86_64 /bin/bash -c " $(curl -fsSL )"

這種透過轉制的 Homebrew 在某些軟體上可能有一些相容性問題,因此建議安裝另一個手動編譯版:

$ sudo mkdir -p /opt/homebrew

$ sudo chown -R $(whoami) :staff/opt/homebrew

$ cd /opt

$ curl -L https:/ /github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

第一種方式安裝的  Homebrew 在 /usr/local/bin 目錄下,而第二種方式安裝的在  /opt/homebrew 目錄下,後者不會自動新增到 PATH 環境變數中,因此需要手動設定:

exportPATH= "/opt/homebrew/bin: $PATH"

這樣,你的 Mac 裡就有了兩個 Homebrew:一個是 Rosetta 轉換的,一個是原生的。原生的目錄在前面,那麼 brew 命令將預設執行這個版本。

如果想執行 Rosetta 轉換版怎麼辦?我們可以單獨設定一個 ibrew 命令:

aliasibrew= 'arch -x86_64 /usr/local/bin/brew'

目前,Homebrew 尚未提供用於 ARM Mac 的預編譯軟體包,因此最好使用  brew install -s 命令進行安裝。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956340/viewspace-2741503/,如需轉載,請註明出處,否則將追究法律責任。

相關文章