brew
在此文档中,我们将使用 jq 来解析 JSON,可使用 brew install jq
从 Homebrew 获取。
brew
提供命令以从系统中获取常见类型的信息。 brew list
显示已安装的配方。 brew deps foo
显示 foo
所需的依赖项。
当然可以编写其他命令(包括外部命令)以提供更详细的信息。这里有一些缺点。首先,它要求针对可能更改的 Homebrew 代码库编写 Ruby。在重构期间将有更多代码需要修改,并且 Homebrew 无法保证外部命令将继续有效。其次,它要求设计命令本身,指定输入参数和输出格式。
为了使用户能够在没有上述问题的情况下进行丰富的查询,Homebrew 提供了 brew info
命令。
brew info --json
brew info
可以输出有关配方的 JSON 格式信息。然后可以使用你选择的工具解析此 JSON。在 brew info --help
中查看更多详细信息。
默认架构版本为 v1
,它返回有关配方的信息;指定 --json=v2
以包括配方和木桶。请注意,可以根据需要将字段添加到架构中,而无需增加架构。任何重大破坏性更改都将导致架构版本更改。
架构本身目前未在 formula.rb
代码之外的文档中记录,它会生成架构。
JSON 输出的顶级元素始终是一个数组,因此 map
运算符用于对数据进行操作。
brew info --json=v1 tig | jq .
要显示有关所有已安装配方的完整 JSON 信息
brew info --json=v1 --installed
一些配方标记为“仅木桶”,这意味着已安装的文件未链接到共享的 bin
、lib
等目录,因为这样做会导致冲突。此类配方可以强制链接到共享目录,但不建议这样做(并且会导致 brew doctor
抱怨。)
要查找已链接的仅木桶配方的名称
brew info --json=v1 --installed | jq "map(select(.keg_only == true and .linked_keg != null) | .name)"
要查找已安装但未链接到共享目录的普通(非仅木桶)配方的名称
brew info --json=v1 --installed | jq "map(select(.keg_only == false and .linked_keg == null) | .name)"
formulae.brew.sh 有一个 已记录的 JSON API,它提供对 brew info --json=v1
输出的访问,而无需访问 Homebrew。
通过使用 JSON 输出,可以针对 Homebrew 进行查询,而无需担心因 Homebrew 代码更改而中断,也无需了解 Homebrew 的 Ruby 内部结构。
如果 JSON 输出未提供它应该提供的一些信息,请提交请求,最好附上添加所需信息的补丁。