瓶裝是透過使用 brew install --build-bottle <formula>
安裝公式,然後使用 brew bottle <formula>
進行瓶裝而產生的。此動作會在目前目錄中產生一個瓶裝檔案,並輸出瓶裝 DSL 以插入公式檔案。
當正在安裝的公式定義了一個與你的系統相符的瓶裝時,在你執行 brew install <formula>
時,它會自動下載並安裝。
瓶裝將不會使用於下列情況:
--build-from-source
),pour_bottle?
),cellar
既不是 :any
(它需要安裝到特定的 Cellar 路徑)也不是等於目前的 HOMEBREW_CELLAR
(所需的 Cellar 路徑與目前的 Homebrew 安裝不符)。當提交一個 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 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
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 中提供了其他與 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