通过使用 brew install --build-bottle <formula>
安装公式,然后使用 brew bottle <formula>
将其装瓶来生成瓶子。这会在当前目录中生成一个瓶子文件,并输出瓶子 DSL 以插入到公式文件中。
当正在安装的公式定义了一个与你的系统匹配的瓶子时,当你运行 brew install <formula>
时,它将被自动下载并安装。
在以下情况下不会使用瓶子
--build-from-source
),pour_bottle?
),cellar
既不是 :any
(它需要安装到特定的 Cellar 路径),也不是等于当前的 HOMEBREW_CELLAR
(所需的 Cellar 路径与当前 Homebrew 安装的路径不匹配)。当提交拉取请求时,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
。
瓶子在配方定义中由 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
)可以选择包含用于确定瓶子 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 中提供了另一种与容器相关的办法。
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