瓶子(二进制包)

通过使用 brew install --build-bottle <formula> 安装公式,然后使用 brew bottle <formula> 将其装瓶来生成瓶子。这会在当前目录中生成一个瓶子文件,并输出瓶子 DSL 以插入到公式文件中。

用法

当正在安装的公式定义了一个与你的系统匹配的瓶子时,当你运行 brew install <formula> 时,它将被自动下载并安装。

在以下情况下不会使用瓶子

创建

当提交拉取请求时,BrewTestBot 会为 homebrew/core 公式创建瓶子。如果公式在每个受支持的平台上都能成功构建,并且维护者批准了更改,BrewTestBot 就会更新其 bottle do 块,并将每个瓶子上传到 GitHub Packages

默认情况下,将针对 OS/架构支持的最早 CPU 构建瓶子(对于 64 位 x86 操作系统为 Core 2)。这可确保瓶子与你可能分发给所有计算机兼容。如果你真的希望瓶子针对其他内容进行优化,你可以传递 --bottle-arch= 选项以针对其他架构构建;例如,brew install foo --build-bottle --bottle-arch=penryn。请记住,如果你针对较新的架构构建,某些用户可能会获得他们无法运行的二进制文件,这会很遗憾!

格式

瓶子是已编译二进制文件的简单 gzip tarball。配方名称、版本、目标操作系统和重新构建版本存储在文件名中,任何其他元数据都在配方的瓶子 DSL 中,配方定义位于瓶子中的 <formula>/<version>/.brew/<formula>.rb

瓶子 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)

可以选择包含用于确定瓶子 URL 的 URL 根。

默认情况下,这被省略,并且使用 Homebrew 的默认瓶子 URL 根。这对于希望为其配方提供瓶子或迎合非默认 HOMEBREW_CELLAR 的水龙头可能很有用。

酒窖 (cellar)

可以选择包含构建瓶子的 HOMEBREW_CELLAR 的值。

大多数已编译软件都包含对其已编译位置的引用,从而防止将其简单地重新定位到磁盘上的任何位置。值 :any:any_skip_relocation 表示瓶子可以安全地安装在任何酒窖中,因为它不包含对其最初构建的酒窖的任何引用。如果瓶子是为给定 OS/架构的默认 HOMEBREW_CELLAR 编译的,则可以省略此项,就像 BrewTestBot 构建的所有瓶子所做的那样。

重新构建版本 (rebuild)

可以选择包含瓶子的重新构建版本。

有时可能需要更新瓶子,而无需增加配方的版本或修订版,例如,如果应用了新补丁。在这种情况下,rebuild 的值将为 1 或更多。

校验和 (sha256)

包含给定 OS/架构的瓶子的 SHA-256 哈希。

公式 DSL

公式 DSL 中提供了另一种与容器相关的办法。

倒出容器 (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