自制软件:以编程方式复制安装?

homebrew: programmatically replicate an installation?

我想将我的 macos brew 配置复制到多台机器上。

有没有办法以编程方式检查 brew 的状态或让它生成一组命令来与另一台机器同步状态?

更新:似乎没有任何东西,所以我整理了一个快速包来做这个。到目前为止,它对我来说效果很好。

https://github.com/marhar/brewmaster

好问题!!!

不确定是否有 "correct" 方法来做到这一点,但我也想这样做,让我的笔记本电脑的 Homebrew 与我的桌面保持同步.我开始写一些东西,以期拥有一个 export settings 命令和一个 import settings 命令,并将设置保存在两台机器之间的 Dropbox 中。

我可以列出所有已安装的包并遍历它们,然后获取用于安装每个特定包的选项 - 我使用 JSON 输出和 jq 自制包来解析选项。

然后我 运行 遇到问题...

1) 当你在第二台机器上安装时,有依赖项,有时 home-brew 会为你安装依赖项,但它会使用默认选项安装它,除非你先使用正确的选项安装它。解决此问题的一种方法是使用选项从您的软件包列表中强制重新安装东西,即使它们由于安装以前的软件包而已经以默认状态安装。

2) 第二个问题是pinned 包在某个版本固定。这开始让我大吃一惊,我放弃了,因为我并不担心笔记本电脑上的不同设置。

FWIW,这是我开始编写的代码的主要部分 - 它不完整并且可能是错误的,但是再次十次它可能会让你或其他人开始滚动。

   first=1
   # Start output file with array so we can use map()
   echo "["                                                               >  "$f"
   # Iterate over all installed packages
   for pkg in $(brew list); do
      [ $first -ne 1 ] && echo ","                                        >> "$f"
      [ $verbose -gt 0 ] && echo Processing package: $pkg
      # Find options used for this package
      options=$(brew info --json=v1 $pkg | jq '.[].installed[0].used_options')
      echo "{\"name\":\"$pkg\",\"used_options\":$options}"                >> "$f"
      first=0
   done
   # Close array in output file
   echo "]"                                                               >> "$f"

一个有用的信息是每个安装的包中都有一个名为 "INSTALL_RECEIPT.json" 的可解析文件,它告诉您很多有用的东西...

find /usr/local -name "INSTALL_RECEIPT*"

这是我用来解析它们的其他几个片段

# List package names
#jq -r '.packages[] | .["package-name"]' < *json

# List options for package "imagemagick"
#jq -r '.packages[] | select(."package-name"=="imagemagick") | .options[]' < *json

在同步安装方面可能不完全是您要找的东西,但您应该查看 Brewfiles 和 Bundler:https://github.com/Homebrew/homebrew-bundle

这是一个在多台机器上运行 brew 的简单包,将它们同步起来,以便它们安装相同的包。我也添加了对字体同步的支持。

https://github.com/marhar/brewmaster