`brew list` 显示了许多我没有安装的东西。为什么?如果安装的某些东西取决于它们,我怎么知道?

vas*_*vas 10 macos homebrew package-managers

在一台新机器上,我使用brew只安装了四个东西:gitnode和。后来,当我跑步时,我被告知许多其他我没有安装的东西都是“过时的”。我跑了并得到以下信息:sqlitelessbrew updatebrew list

brotli              less               pcre2
c-ares              libnghttp2         python@3.9
ca-certificates     libuv              readline
gdbm                mpdecimal          sqlite
gettext             ncurses            xz
git                 node
icu4c               openssl@1.1
Run Code Online (Sandbox Code Playgroud)

这些是从哪里来的?如果它们是因为安装git或需要它们nodeless安装的,我如何找到?

vas*_*vas 39

是的,Homebrew(又名“brew”)与所有包管理器一样,会自动安装依赖项。这是一个递归过程:如果依赖项本身有依赖项,brew 也会安装它们,依此类推。

\n

brew deps

\n

您可以使用以下命令查看安装的任何内容的依赖关系树brew deps

\n
> brew deps node --tree\n\nnode\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 brotli\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 c-ares\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 icu4c\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libnghttp2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libuv\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 openssl@1.1\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ca-certificates\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 python@3.9\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gdbm\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mpdecimal\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 openssl@1.1\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ca-certificates\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 readline\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sqlite\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 readline\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 xz\n
Run Code Online (Sandbox Code Playgroud)\n

你可以在这棵树上看到许多你在树上看到的东西brew list

\n

brew uses

\n

但要回答您的问题,您可以使用以下命令朝相反的方向进行brew uses

\n
> brew uses readline --installed\n\nnode            python@3.9            sqlite\n
Run Code Online (Sandbox Code Playgroud)\n

--installed标志很重要,因为如果没有它,上面的命令将列出使用 的所有内容readline,无论它是否安装在您的系统上。另请注意brew uses是如何递归的(与 的方向相反brew deps),显示了直接python@3.9使用它和间接使用它的情况。readlinenode

\n

brew desc

\n

现在,如果您对这些已安装的依赖项的作用感到好奇,请使用以下命令brew desc

\n
> brew desc pcre2\n\npcre2: Perl compatible regular expressions library with a new API\n
Run Code Online (Sandbox Code Playgroud)\n

brew leaves -r

\n

如果您只想要具体安装的简短列表,brew leaves -r则适用于大多数情况:

\n
> brew leaves -r\n\ngit\nless\nnode\nsqlite\n
Run Code Online (Sandbox Code Playgroud)\n

brew leaves列出已安装但不是依赖项的内容(它们是上面树中的叶子),并将-r列表过滤为您手动安装的内容。

\n

我说“大多数情况”是因为它不包括您手动安装但不再离开的东西。当您安装另一个依赖于您最初手动安装的内容时,就会发生这种情况。例如,如果我readline手动安装,brew leaves -r首先会显示它,但在安装后不会node显示sqlite

\n

对于很多人来说,“叶子”和“手动安装”是同一件事。但安装得越多,出错的可能性就越大。

\n

brew bundle dump --file -

\n

这是一个更难记住的命令(创建别名!),但它给出了比以下命令更可靠、更完整的答案brew leaves -r

\n
> brew bundle dump --file -\n\nbrew "git"\nbrew "less"\nbrew "node"\nbrew "sqlite"\ncask "rar"\n
Run Code Online (Sandbox Code Playgroud)\n

它更完整,因为与它不同的是,brew leaves它将包括您手动安装的东西,即使它们不再离开。此外,它还包括水龙头和木桶。

\n

我从@orlp\'s 在 Ask Different 上的回答中学到了这个技巧。

\n