2019年10月14日 星期一

Homebrew 簡介


Homebrew 簡介


要在 macOS 上安裝應用程式可以透過:Mac App Store (MAS)、應用程式的官網、或是下載原始碼等方式。MAS 提供了簡便的應用程式安裝方式,只要在 App Store 搜尋到需要的應用程式,再點選「取得」即可安裝。但是,有許多的應用程式(特別是許多系統開發工具),並沒有在 MAS 上架,無法藉由 MAS 取得。而由較具規模的組織或公司所開發的應用程式,大多有設有官網可以下載應用程式,安裝過程也十分簡單1。但是某些透過進階安裝的應用程式,較不容易控管其版本與安裝內容,而且在移除時需要注意是否有殘留的檔案或資料夾。下載原始碼安裝,雖可以讓使用者量身打造自己的應用程式。但是應用程式彼此之間的相依性問題以及未來的升級管理,都會對使用者造成困擾。

為了安裝與管理應用程式,不少的作業系統、伺服端執行環境、程式語言等,都提供了套件管理工具。例如,Debian 的 APT、openSUSE 的 Zypper、Fedora 及 CentOS 的 YUM 、node.js 的 NPM、或是 Python 的 PIP 等。而在 macOS,Homebrew 就是最被廣為使用的套件管理工具。

Homebrew 是 macOS 缺少套件的管理工具 (The missing package manager for macOS)2,官網為 https://brew.sh/。Brew 通常可以指 "釀造啤酒",Homebrew 是在家裡釀造啤酒;套件管理工具 Homebrew,代表使用者需要 "自行"(home) "下載並安裝" 套件(brew)。因為借用了釀造啤酒一詞,所以在相關的術語中,使用了配方 (Formula)、酒桶 (Keg)、酒瓶 (Bottle)、出酒閥 (Tap)、酒窖 (Cellar) 等許多和釀造啤酒有關的名詞。相關術語的介紹請參考下一小節。

Homebrew 是以 Ruby 語言寫成的命令列套件管理 (command line package manager) 程式 ,它提供了一個統一的方法讓使用者可以輕易地在 macOS 上進行安裝、升級與移除軟體。它的功能有 git 版本庫訪問 (Repository Access)、相依性處理 (Dependency Solving)、以及套件安裝 (Package Installation) 等。

註1. 雙擊下載的 DMG 檔會自動掛載虛擬磁碟機,並且開啟一個 Finder 視窗:1)視窗內如果有一個 APP 檔和指向 "應用程式" 資料夾的捷徑,只需要將 APP 檔拖拉至 "應用程式" 資料夾捷徑即可完成安裝。2)視窗內如果沒有 "應用程式" 資料夾捷徑,通常代表需要雙擊 APP 檔或是 PKG 檔,進行進階安裝。
註2. Homebrew 現在也可以用於 Linux 以及 Windows Subsystem for Linux(WSL),所以英文版的首頁已經改為 The missing package manager for macOS (or Linux)。


Homebrew 相關術語


釀造啤酒需要 Formula、Keg、Bottle、Tap、Cellar 等器具或場所。Homebrew 借用了這些詞語做為相關的術語。首先,釀造啤酒需要有 Formula 來決定需要使用那些材料以及其使用量。在 Homebrew 中,Formula 是一種特定領域語言 (Domain-specific language, DSL),是由 Ruby 指令碼集所構成的套件定義檔,用來管理軟體間的相依性、原始碼的下載、以及進行軟體的配置與編譯等。在使用 Homebrew 時,會先從 Git 版本庫 (Homebrew 預設使用的是 GitHub 提供的版本庫) 中下載 Formulae。

當釀好酒後,需要 Keg 來存放成品,並且需要 Cellar 來存放的 Kegs。在 Homebrew 中,Keg 為套件的安裝前綴,通常包含了套件名稱以及版本,而 Cellar 則為 存放 Kegs 的目錄。預設 Cellar 路徑為 /usr/local/Cellar,完整的套件安裝路徑預設為:
/usr/local/Cellar/套件名稱/版本

要將 Keg 中的啤酒倒出來,通常會在 Keg 上加上 Tap(Tap a keg);Tap 當名詞時是指出酒閥,當動詞時是指在 Keg 加上 TAP 的動作。在 Homebrew,Tap 當名詞時是指由 formulae 所形成的 Git 版本庫3,當動詞時是指在本機建立這些 Git 版本庫的複本。

啤酒除了可以裝在 Keg 中之外,也可以分裝在小酒瓶(Bottle)中。在 Homebrew 中, Bottle 是依照預設參數編譯好的套件 (通常為 .tar.gz 檔),會依照打包時的路徑進行安裝。Homebrew 的目標是希望所有的套件都是利用 Bottle 安裝(We aim to bottle everything.)。


下表參考自:https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#homebrew-terminology

名稱描述範例
Formula套件定義/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/foo.rb
KegFormula 的安裝前綴預設為 /usr/local/Cellar/套件名稱/版本
opt prefixKeg 現行安裝版本的 symlink/usr/local/opt/套件名稱
Cellar所有的 Kegs 將被安裝在此/usr/local/Cellar
TapFormulae (以及/或是命令) 的 Git 版本庫homebrew/core 在本機會存放在 /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
Bottle預建的 Keg (預先編譯好的套件)在 .tar.gz 前會有 bottle 關鍵字,例如qt-4.8.4.mavericks.bottle.tar.gz
Cask用來安裝 macOS 原生 Apps 的 homebrew 擴充/Applications/MacDown.app/Contents/SharedSupport/bin/macdown
Brew Bundle用來描述相依性的 homebrew 擴充brew 'myservice', restart_service: true


註3. Taps 之前被分類為:
1) 主要版本庫 (Main repository),通常指的是 homebrew/core;
2) 主要 Taps (Main taps),包含了 homebrew/nginx、homebrew/php、homebrew/science 等;
3) 其他有趣的 Taps (Other interesting taps) 或是第三方版本庫 (Third-party repositories),格式為 <user/repo> 的 Taps。
但是從 2018 年(Homebrew 1.5.0)開始,大部份的 Main taps 已經被移入 Main repository,Tap 也被更名為第三方版本庫(請參考這裡這裡以及這裡)。


安裝以及移除 Homebrew



安裝 Xcode 命令列工具 (Command Line Tools)4
xcode-select --install


要安裝 Homebrew 只需要在終端機命令列提示貼上下列的指令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


要移除 Homebrew 只需要在終端機命令列提示貼上下列的指令:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"


註4. Command Line Tools 為 Xcode 的子集,是一個獨立套件。能在 macOS 終端機介面提供 clang、cpp、GCC、git、make、perl 等許多常用的工具,實用程序和編譯器。

軟體安裝簡易流程


1. 找到軟體所屬的 Tap(如果套件不屬於 Homebrew/core)。

2. 更新所有的 Formulae、升級已安裝的軟體、以及移除所有舊的 formulae
brew update
brew upgrade
brew cleanup


3. 下載軟體所屬的 Tap (不屬於主要版本庫的套件)
brew tap <user/repo>


4. 查詢軟體的安裝選項 (如果需要的話)
brew info <formula>


5. 安裝套件5, 6, 7
brew install <formula> [--with-參數]


6. 將已安裝套件的服務加入 Launchd,設定為開機啟動的守護行程 (daemon),brew services 的介紹請參考
brew services start <formula>


註5. 如果沒有使用安裝選項,預設是使用 bottled 版本。
註6. Homebrew 預設會將套件安裝在 /usr/local/Cellar,執行檔則會 symlink 到 /usr/local/bin,設定檔會在 /usr/local/etc,而 /usr/local/opt 則是套件現行版本的 symlink。
註7. 在安裝完套件後,如果顯示套件為 keg-only,表示套件將僅安裝在 Cellar,而不會被連結到 /usr/local;通常的原因是因為電腦中已經相同名稱的套件。如果要手動符號連結到 /usr/local/ 可以使用 brew link 指令。


指令簡易介紹


顯示 Homebrew 版本
brew -v


檢查 Homebrew 狀態
brew doctor


使用說明
brew help


顯示 Homebrew 安裝路徑
brew --prefix


更新電腦上全部的 Formulae
brew update


更新所有已安裝的套件
brew upgrade


更新指定的套件
brew upgrade <formula>


列出過時 (需要更新) 的套件
brew outdated


列出目前電腦上所有版本庫的名稱
brew tap


下載或更新指定的 Tap
brew tap <homebrew/homebrew-repo>
brew tap <user/repo>


移除指定的 Tap
brew untap <homebrew/homebrew-repo>
brew untap <user/repo>


查詢套件的資訊  (可以用來查詢套件有那些安裝參數可以使用)
brew info <formula>


安裝套件
brew install <formula> [--with-參數]


移除套件
brew uninstall <formula>


將套件符號連結至 /usr/local
brew link <formula>


移除已安裝套件的 symlink,但是不移除套件
brew unlink <formula>


將已安裝套件的服務加入 Launchd,設定為開機啟動的守護行程(brew services 的介紹請參考
brew services start <formula>


顯示已安裝的套件清單
brew list


顯示已安裝的特定套件的安裝內容(檔案夾以及檔案)
brew list <formula>


顯示全部可安裝的套件清單
brew search


搜尋特定的套件
brew search <formula>


列出指定軟體的依賴關係
brew deps <formula>


顯示特定套件的安裝路徑
brew --prefix <formula>


移除所有舊的 formulae
brew cleanup


移除舊的 formula
brew cleanup <formula>


固定第三方版本庫
brew tap-pin <username/repo>


停止對套件進行 update/upgrade
brew pin <formula>


恢復對套件進行 update/upgrade
brew unpin <formula>



補充說明:


1. 安裝套件前一定要先執行 brew update,並建議執行 brew upgrade。

2. 在安裝軟體時,如果有多個版本庫所提供的套件 (配方) 名稱重複,brew 會依照下列的順序來決定要使用那一個 formula:(1) 使用 tap-pin 固定的版本庫 (pinned taps)、(2) 核心配方 (core formulae,在 homebrew/core 的 formulae)、(3) 其它的版本庫 (other taps)。

3. 其他的操作可以參考 https://docs.brew.sh/FAQ.html


沒有留言: