常见问题解答 (FAQ)

有没有术语表?

配方手册中列出了 Homebrew 术语

如何更新我的本地程序包?

首先更新所有程序包定义(公式)和 Homebrew 本身

brew update

现在,你可以列出已安装的哪些程序包(keg)已过时

brew outdated

使用以下命令升级所有内容

brew upgrade

或使用以下命令升级特定公式

brew upgrade <formula>

如何阻止更新某些公式?

阻止更新/升级

brew pin <formula>

再次允许该公式更新

brew unpin <formula>

请注意,如果另一个公式依赖固定过时的公式,则需要在需要时对其进行升级,因为我们不允许针对过时的版本构建公式。如果不希望这样做,你可以使用 brew extract在 tap 中维护自己的公式副本

如何卸载 Homebrew?

要卸载 Homebrew,请运行 Homebrew/install 存储库中的卸载脚本

在升级时如何保留公式的旧版本?

Homebrew 会自动卸载使用 brew upgrade 升级的每个公式的旧版本,并定期每 30 天执行一次其他清理。

禁用自动 brew cleanup

export HOMEBREW_NO_INSTALL_CLEANUP=1

仅针对公式 foobar 禁用自动 brew cleanup

export HOMEBREW_NO_CLEANUP_FORMULAE=foo,bar

当自动 brew cleanup 被禁用时,如果你卸载了一个软件包,它只会移除你安装的最新版本。它不会移除你过去可能安装过的所有版本的软件包。当你运行 brew upgrade 时,Homebrew 将继续尝试安装它所知道的最新版本。这可能会令人惊讶。

在这种情况下,要完全移除一个软件包,你可以运行 brew uninstall --force <formula>。小心,因为这是一个破坏性操作。

为什么 brew upgrade <formula>brew install <formula> 也会升级其他很多东西?

Homebrew 不支持任意混合和匹配软件包版本,因此软件包所依赖的一切,以及反过来依赖于它的所有内容,都需要升级到最新版本,因为这是我们测试的唯一软件包组合。因此,任何给定的 upgradeinstall 命令都可以升级许多其他(看似无关的)软件包,特别是如果像 pythonopenssl 这样的重要内容也需要升级。

东西从哪里下载?

brew --cache

通常是: ~/Library/Caches/Homebrew

我的 Mac .app 找不到 Homebrew 实用程序!

默认情况下,macOS 上的 GUI 应用程序在其 PATH 中没有 Homebrew 的前缀。如果你使用的是 Mountain Lion 或更高版本,你可以通过运行 sudo launchctl config user path "$(brew --prefix)/bin:${PATH}" 然后重新启动来修复此问题,如 man launchctl 中所述。请注意,这会为所有用户设置 launchctl PATH。有关 macOS 的早期版本,请参阅 此页面

如何为 Homebrew 做贡献?

阅读我们的 贡献指南

为什么编译所有东西?

Homebrew 为许多软件包提供了预构建的二进制包。这些被称为 瓶子,可在 https://github.com/Homebrew/homebrew-core/packages 获得。

如果可用,则默认情况下将使用瓶装二进制文件,但以下情况除外

我们的目标是为所有内容创建 bottle。

为什么我应该在默认位置安装 Homebrew?

许多公式的 Homebrew 预构建二进制包(称为 bottle)仅当您安装在默认安装前缀中时才能使用,否则必须从源代码构建。从源代码构建需要很长时间,容易出现故障,并且不受支持。默认前缀为

帮自己一个忙,安装到默认前缀,以便您可以使用我们的预构建二进制包。选择其他前缀自担风险!

为什么 Apple Silicon 上的默认安装前缀是 /opt/homebrew

选择前缀 /opt/homebrew 是为了允许在 /opt/homebrew 中针对 Apple Silicon 安装,在 /usr/local 中针对 Rosetta 2 安装,并且共存并使用 bottle。

为什么 Linux 上的默认安装前缀是 /home/linuxbrew/.linuxbrew

选择前缀 /home/linuxbrew/.linuxbrew 是为了让没有管理员访问权限的用户仍然可以通过 linuxbrew 角色帐户从预编译二进制文件受益。如果您自己没有管理员权限,请考虑要求您的管理员人员为您创建一个 linuxbrew 角色帐户,其主目录为 /home/linuxbrew

为什么 Homebrew 说 sudo 不好?

太长不看 Sudo 很危险,而且您无论如何都可以在没有 sudo 的情况下安装 TextMate.app。

Homebrew 拒绝使用 sudo 工作。

您应该只对您信任的工具使用 sudo。当然,您可以信任 Homebrew 😉 — 但您是否信任 Homebrew 运行的多兆字节 Makefile?开发人员通常对 C++ 的理解远好于对 make 语法的理解。对这样的东西使用 sudo 风险太大。它可以修改(或上传)系统上的任何文件。事实上,我们已经看到一些构建脚本尝试修改 /usr,即使前缀完全指定为其他内容也是如此。

我们使用 macOS 沙盒来阻止此操作,但当以 root 用户(它还具有对系统上几乎所有内容的读写访问权限)身份运行时,此操作不起作用。

您是否 chown root /Applications/TextMate.app?可能没有。那么 chown root wget 重要吗?

如果您需要在多用户环境中运行 Homebrew,请考虑创建一个专门用于使用 Homebrew 的单独用户帐户。

为什么没有记录某个特定命令?

如果不在 man brew 中,则它可能是一个 外部命令,可以使用 --help 查看文档。

为什么没有合并我的拉取请求?

如果已解决所有维护者反馈,并且所有测试都通过,请使用“bump”注释将其提升。有时我们会错过请求,并且有很多请求。在此期间,请重新调整您的拉取请求,以便更轻松地合并。

我可以自己编辑公式吗?

是的!很简单!如果 brew tap 未显示 homebrew/core,请设置自己编辑本地副本

  1. 在您的 shell 环境中设置 HOMEBREW_NO_INSTALL_FROM_API=1
  2. 运行 brew tap homebrew/core 并等待克隆完成,然后
  3. 运行 brew edit <formula>EDITOR 中打开公式。

您不必将修改提交回 homebrew/core,只需将公式编辑为您个人需要的内容并 brew install <formula>。作为奖励,brew update 会将您的更改与上游合并,因此您仍然可以使公式保持最新,同时进行个人修改!

请注意,如果您正在编辑核心公式或 cask,则必须在使用 brew installbrew update 之前设置 HOMEBREW_NO_INSTALL_FROM_API=1,否则它们将忽略您的本地更改并默认为 API。

要撤消对 Homebrew 任何存储库所做的所有更改,请运行 brew update-reset。它将恢复到所有 Homebrew 存储库的上游状态。

我可以制作新的公式吗?

是的!很简单!如果您已经拥有 homebrew/core 的本地副本(请参见上文),只需使用 brew create 命令。然后,Homebrew 将在 EDITOR 中打开公式,以便您可以对其进行编辑,但它可能已经安装;请尝试:brew install <formula>。如果您遇到任何问题,请使用 --debug 开关运行命令,如下所示:brew install --debug <formula>,这会将您转到调试 shell。

如果您希望您的新公式成为 homebrew/core 的一部分或想了解有关编写公式的更多信息,请阅读 公式食谱

如何从别人的拉取请求中获取公式?

确保您拥有 homebrew/core 的本地副本,然后

brew update
brew install hub
cd "$(brew --repository homebrew/core)"
hub fetch github_username
hub pr checkout pull_request_number

为什么删除或禁用了某个公式?

使用 brew log <formula> 来找出原因!可能是因为它有 未解决的问题 和/或 我们的分析 表明它没有被广泛使用。

对于已禁用和已弃用的公式,运行 brew info <formula> 也将提供解释。

Homebrew 这个名字很差,太普通了;为什么选择它?

Homebrew 的创建者 @mxcl 并没有太在意啤酒主题,也没有考虑到这个项目实际上可能会流行。当 Max 意识到它很流行时,已经太晚了。然而,今天,“homebrew”的第一个 Google 搜索结果与啤酒无关 😉

“仅限 keg”是什么意思?

这意味着该公式仅安装在 Cellar 中,并且未链接到默认前缀中。这意味着大多数工具都找不到它。你可以通过运行 brew info <formula> 来查看为什么一个公式被安装为仅限 keg,以及将其包含在 PATH 中的说明。

你可以 修改工具的构建配置 来查找仅限 keg 的依赖项。或者,如果你需要,可以使用 brew link <formula> 链接到该公式,不过如果你正在影子 macOS 软件,这可能会导致意外的行为。

如何为公式指定不同的配置参数?

brew edit <formula> 并直接编辑该公式。目前没有其他方法可以做到这一点。

为什么我无法从“未识别开发者”处打开 Mac 应用?

某些应用程序可能会给你一个这样的弹出消息

Gatekeeper unidentified developer message

这是 Apple 的一项安全功能。最重要的一个信息是:你可以允许各个应用程序免除此功能。这允许该应用程序运行,而系统其他部分仍然受到保护。

始终启用系统范围的保护,仅在需要时才为特定应用程序禁用它。

如果你确定要信任该应用程序,你可以右键单击其图标并选择打开来禁用其保护

Right-click the app and choose Open

在结果对话框中,单击打开按钮,让 macOS 永久允许该应用程序在此 Mac 上运行。除非你确定信任该应用程序,否则不要这样做。

Gatekeeper unidentified developer open prompt

或者,你可以在安装时提供 --no-quarantine 开关,以不向特定应用程序添加此功能。

为什么在 brew upgrade 期间不包含某些应用?

在运行 brew upgrade 之后,你可能会注意到一些你认为应该升级的 cask 没有升级。

正如你可能意识到的,许多 macOS 软件可以自我升级

Sparkle update window

当与 Homebrew Cask 的 upgrade 机制一起使用时,这可能会导致冲突。

当软件使用其内置机制进行自我升级时,它会在 Homebrew Cask 毫不知情的情况下进行,导致两个版本不同步。如果您在我们记录的软件版本较低时通过 Homebrew Cask 进行升级,您将获得降级版本。

有一些想法可以解决此问题

所以我们让软件保持原样。使用 Homebrew Cask 安装的任何内容都应与手动安装时一样。但是,由于我们还希望支持不会进行自我升级的软件,因此我们为确实进行自我升级的软件的木桶添加了 auto_updates true,这会将它们排除在 brew upgrade 之外。

使用 version :latest 的木桶也会被排除,因为我们无法跟踪其已安装版本。这有助于要求此类软件的开发人员提供版本化版本(即在下载 url 的路径中包含版本)。

如果您仍然希望通过 Homebrew Cask 强制升级软件,您可以在 upgrade 命令中具体引用它

brew upgrade <cask>

或使用 --greedy 开关

brew upgrade --greedy

请参阅 brew 手册页upgrade 部分以了解更多详情。

为什么当我运行 brew upgrade 时,我的 cask 应用会丢失其 Dock 位置/Launchpad 位置/权限设置?

Homebrew 有两种可能的策略来更新木桶应用程序:卸载旧版本并重新安装新版本,或用新内容替换应用程序的内容。使用卸载/重新安装策略,macOS 认为该应用程序正在被删除,而没有重新安装它的意图,因此它会删除旧应用程序的一些内部元数据,包括它在 Dock 和 Launchpad 中显示的位置以及它被授予的权限。内容替换策略通过将升级视为就地升级来解决此问题。但是,从 macOS Ventura 开始,只有当更新程序应用程序(在本例中,是运行 Homebrew 的终端)具有 某些已授予的权限 时,才允许进行就地升级。“应用程序管理”或“完全磁盘访问”权限将足以满足要求。

当 Homebrew 具有必要的权限时,它会默认进行就地升级。否则,它将使用卸载/重新安装策略。

Fork me on GitHub