瓶裝(二進制套件)

瓶裝是透過使用 brew install --build-bottle <formula> 安裝公式,然後使用 brew bottle <formula> 進行瓶裝而產生的。此動作會在目前目錄中產生一個瓶裝檔案,並輸出瓶裝 DSL 以插入公式檔案。

用法

當正在安裝的公式定義了一個與你的系統相符的瓶裝時,在你執行 brew install <formula> 時,它會自動下載並安裝。

瓶裝將不會使用於下列情況:

建立

當提交一個 pull request 時,BrewTestBot 會為 homebrew/core 公式建立瓶裝。如果公式在每個受支援的平台上都成功建置,而且維護者核准變更,BrewTestBot 會更新其 bottle do 區塊,並將每個瓶裝上傳到 GitHub Packages

預設情況下,瓶裝會為你正在建置的作業系統/架構所支援的最舊 CPU 建置(64 位元 x86 作業系統為 Core 2)。這可確保瓶裝與你可能分發它們的所有電腦相容。如果你真的想要你的瓶裝針對其他東西進行最佳化,你可以傳遞 --bottle-arch= 選項來為另一個架構建置;例如,brew install foo --build-bottle --bottle-arch=penryn。請記住,如果你為較新的架構建置,你的某些使用者可能會取得無法執行的二進制檔案,那會很令人難過!

格式

瓶子是已編譯二進位檔案的簡單 gzipped tarball。配方名稱、版本、目標作業系統和重新建置版本儲存在檔案名稱中,任何其他元資料都在配方的 bottle DSL 中,而配方定義則位於 bottle 中的 <formula>/<version>/.brew/<formula>.rb

Bottle DSL(特定領域語言)

瓶子在配方定義中由 bottle do ... end 區塊中包含的 DSL 指定。

一個簡單(且典型的)範例

bottle do
  sha256 arm64_big_sur: "a9ae578b05c3da46cedc07dd428d94a856aeae7f3ef80a0f405bf89b8cde893a"
  sha256 big_sur:       "5dc376aa20241233b76e2ec2c1d4e862443a0250916b2838a1ff871e8a6dc2c5"
  sha256 catalina:      "924afbbc16549d8c2b80544fd03104ff8c17a4b1460238e3ed17a1313391a2af"
  sha256 mojave:        "678d338adc7d6e8c352800fe03fc56660c796bd6da23eda2b1411fed18bd0d8d"
end

一個完整的範例

bottle do
  root_url "https://example.com"
  rebuild 4
  sha256 cellar: "/opt/homebrew/Cellar", arm64_big_sur: "a9ae578b05c3da46cedc07dd428d94a856aeae7f3ef80a0f405bf89b8cde893a"
  sha256 cellar: :any,                   big_sur:       "5dc376aa20241233b76e2ec2c1d4e862443a0250916b2838a1ff871e8a6dc2c5"
  sha256                                 catalina:      "924afbbc16549d8c2b80544fd03104ff8c17a4b1460238e3ed17a1313391a2af"
  sha256                                 mojave:        "678d338adc7d6e8c352800fe03fc56660c796bd6da23eda2b1411fed18bd0d8d"
end

根 URL (root_url)

選擇性地包含用於決定 bottle URL 的 URL 根目錄。

預設情況下,這會被省略,且會使用 Homebrew 的預設 bottle URL 根目錄。這對於希望為其配方提供 bottle 或迎合非預設 HOMEBREW_CELLAR 的 tap 可能很有用。

儲藏室 (cellar)

選擇性地包含 bottle 建置所在的 HOMEBREW_CELLAR 的值。

大多數已編譯的軟體都包含其已編譯位置的參考,防止它被簡單地重新定位到磁碟上的任何位置。:any:any_skip_relocation 的值表示 bottle 可以安全地安裝在任何儲藏室中,因為它不包含任何參考其最初建置所在的儲藏室。如果 bottle 是為給定作業系統/架構的預設 HOMEBREW_CELLAR 編譯的,則可以省略此值,就像 BrewTestBot 建置的所有 bottle 所做的那樣。

重新建置版本 (rebuild)

選擇性地包含 bottle 的重新建置版本。

有時可能需要更新 bottle 而不會增加配方的版本或修訂,例如,如果套用新的修補程式。在這種情況下,rebuild 的值將為 1 或更多。

檢查碼 (sha256)

包含給定作業系統/架構的 bottle 的 SHA-256 hash。

配方 DSL

配方 DSL 中提供了其他與 bottle 相關的方法。

倒出 bottle (pour_bottle?)

選擇性地傳回一個布林值,以指示安裝此配方時是否應使用瓶子。

例如,如果相關配方已使用非預設選項編譯,則瓶子可能會破裂,因此此方法可以檢查該情況並傳回 false

一個完整的範例

pour_bottle? do
  reason "The bottle needs to be installed into #{Homebrew::DEFAULT_PREFIX}."
  satisfy { HOMEBREW_PREFIX.to_s == Homebrew::DEFAULT_PREFIX }
end

常用的 pour_bottle? 條件可以作為預設符號新增到 pour_bottle? 方法,允許它們像這樣指定

pour_bottle? only_if: :default_prefix
pour_bottle? only_if: :clt_installed
Fork me on GitHub