brew挖坑填坑记
前言
前段时间被一公众号安利了款替代Docker Desktop
的mac软件——OrbStack,号称快速、内存占用小,还能用来管理创建虚拟机等。
感受过Docker Desktop的诟病以及频繁使用虚拟机的需求,毫不犹豫的上官网看介绍准备体验一番。
当看到安装部分时,可通过 brew 安装,心想着这不挺好的,而后看到一行 macOs >12
小字,emm 这不是逼着升级系统么?
在网上 macOs 升级后的各种问题,犹豫了下,最终还是铁下心来进行了升级。万幸,系统升级后并没有出现网友所说的严重(无法开机、卡顿、掉电等)情况。
安装升级
打开终端 brew install orbstack
历经一段时间后安装成功。运行软件操作页面以及功能正如官网介绍那般,非常符合我心意。
而后继续通过官网深入了解了OrbStack,新的版本修复了些bug,而且还有更好的体验,然后对比了下自己安装的版本稍微低了点,心想着那不得更新体验下。
怎么更新呢? 原本电脑的上的很多软件都是通过 brew 进行管理,那就用 brew upgrade 升级下看看呗。
使用 brew upgrade --cask orbsack
后再看下版本,咦!what?为啥没有更新?随后上 brew 官网查询了下 orbstack 的版本1.1.0_16370
。
这就让我郁闷了,不是能查到最新版本么,为啥不能更新版本? 而且更新的时候也没像最开始安装时展示些信息,难道是缓存导致?想到这里网上搜索了下 brew 缓存路径。
通过 cd $(brew --cache)
命令进入缓存目录,在Cask文件里还真有旧版本的安装包文件,二话不说直接删除文件,然后执行brew uninstall orbstack
。 心想这下重新安装总可以了吧
观察分析
兴致勃勃的来了个 brew install --cask orbstack
这次仔细观察了下 brew 安装时的信息,恩哼?what?为啥还是之前的版本?
在疑惑的同时还注意到brew安装时的步骤:
1、先下了一个 orbstack.rb
文件
2、然后在下载 dmg 的安装包
3、而后再进行依赖包下载安装 (若有)
4、最后安装软件。
到这基本可以确定的是 orbstack.rb
文件安装就是旧版的 orbstack。
再次回到 brew 的缓存目录,进入 downloads 目录下看到带很长校验码前缀的 orbstack.rb
文件,查看文件内容果然写的就是旧版的。
那怎么办呢?这会想起最开始安装brew时了解到的信息: 桌面软件的安装是由 homebrew-cask 扩展来管理的,而brew本身以及其扩展的更新就是 git pull 最新的master分支代码。
嗯?难道非得更新 brew 来才能安装这软件么?可我不想更新brew ,因为这玩意一更新就更新安装的其他软件(虽然可通过pin来禁止更新)。
挖坑解决
坑1
这时候又奇思异想了,直接更新 homebrew-cask 的代码不就行了?简直是一气呵成,堪称完美。
cd $(brew --repo homebrew/cask) && git pull && brew install --cask orbstack
看着安装步骤一步步符合预期,心想着这总成了吧?what?
突然出现了一行报错:Error: SHA256 mismatch \n Expected:xxx ; Actual:xxx
什么玩意?sha256 不匹配?看到这想到一般文件下载时都有什么校验码而且会用到 sha256算法,然后回到 缓存 downloads 目录查看 orbstack.rb
文件,版本信息是最新啊。
然后又回到官网orbstack介绍界面,在 /api/cask/orbstack.json
在 ruby_source_checksum 字段找到了报错信息里 Actual 的校验码。
难道是哪里还有旧版本的信息没有更新。关键字 api ? 缓存目录下不是也有 api 、 api-source . 遍历下看到几个 cask 相关 json 文件。
最后在 cask.jsw.json 文件中找到了 Expected的校验码。那么再更新下这个文件不就可以安装新版本了么?那这个最新文件哪里找呢?
坑2
带着上述的问题,又回到了官网找到所有cask的 cask.json, 下载后打开跟 cask.jsw.json 对比了下结构还有点不一样,少了顶层的信息。
卒~~ 那既然全部替换不行那就部分替换呗?仅替换 orbstack 部分的信息,但是奈何文件有点大且这段信息还是json的字符串格式,手动替换着实有点难。
观察json文件 orbstack 信息是在 playload 下数组中的第n元素,那么只要取出playload循环遍历判断是否包含 orbstack 信息,然后覆盖值即可。而后备份了源文件,又写了串java代码使用 fastjson 把数据替换。
再次 brew install --cask orbstack
. 然后又出现了新报错,验证完整性失败(签名不匹配),还给出地址?整个人都麻了...
"Failed to verify integrity (signature mismatch) of: https://formulae.brew.sh/api/cask.jws.json "
解决
根据报错的地址打开发现这不正是我需要的那份完整文件么?这程序设计的真好,顿时感觉老香了。
下载替换原始的 cask.jws.json 文件,再次 brew install --cask orbstack
.
哈哈,安装成功!
小结
不用更新 brew 版本方式升级其他桌面应用软件,步骤如下(应该brew更新的逻辑也是如下吧):
- 通过 git pull 更新桌面应用软件的下载文件,即 homebrew-cask 下各目录中的 *.rb
- 手动下载 cask.jws.json 文件,替换brew缓存目录下cask.jws.json文件
$HOME/Library/Caches/Homebrew/api/cask.jws.json
最后
为了一个新软件的体验,然后心惊胆战的升级了一波系统,然后给又自己挖了两坑,最后耗时7、8个小时(包括系统升级)才把问题解决。
一系列的连锁反应,哎!我太难了,没事体验它干啥玩意?升个什么玩意最新版本?鬼知道这么折腾后会不会有其他问题,后续在研究研究 brew 背后是如何进行管理安装软件的吧。