自制程序:以编程方式复制安装



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

有没有一种方法可以通过编程检查brew的状态,或者让它生成一组命令来与另一台机器同步状态?

更新:似乎什么都没有,所以我整理了一个快速包来做这件事。到目前为止,它对我来说运行良好。

https://github.com/marhar/brewmaster

好问题!!!!

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

我可以列出所有安装的软件包并对其进行迭代,然后获得用于安装每个特定软件包的选项——我使用JSON输出和jq homebrew软件包来解析这些选项。

然后我遇到了问题。。。

1) 当你在第二台机器上安装时,会有依赖项,有时homebrew会为你安装依赖项,但它会使用默认选项安装,除非你首先使用正确的选项安装。解决这一问题的一种方法是,强制从带有选项的程序包列表中重新安装一些东西,即使由于安装了以前的程序包,这些东西已经以默认状态安装。

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

最新更新