brew挖坑填坑記
前言
前段時(shí)間被一公眾號(hào)安利了款替代Docker Desktop 的mac軟件——OrbStack,號(hào)稱快速、內(nèi)存占用小,還能用來(lái)管理創(chuàng)建虛擬機(jī)等。
感受過(guò)Docker Desktop的詬病以及頻繁使用虛擬機(jī)的需求,毫不猶豫的上官網(wǎng)看介紹準(zhǔn)備體驗(yàn)一番。
當(dāng)看到安裝部分時(shí),可通過(guò) brew 安裝,心想著這不挺好的,而后看到一行 macOs >12 小字,emm 這不是逼著升級(jí)系統(tǒng)么?
在網(wǎng)上 macOs 升級(jí)后的各種問(wèn)題,猶豫了下,最終還是鐵下心來(lái)進(jìn)行了升級(jí)。萬(wàn)幸,系統(tǒng)升級(jí)后并沒有出現(xiàn)網(wǎng)友所說(shuō)的嚴(yán)重(無(wú)法開機(jī)、卡頓、掉電等)情況。
安裝升級(jí)
打開終端 brew install orbstack 歷經(jīng)一段時(shí)間后安裝成功。運(yùn)行軟件操作頁(yè)面以及功能正如官網(wǎng)介紹那般,非常符合我心意。
而后繼續(xù)通過(guò)官網(wǎng)深入了解了OrbStack,新的版本修復(fù)了些bug,而且還有更好的體驗(yàn),然后對(duì)比了下自己安裝的版本稍微低了點(diǎn),心想著那不得更新體驗(yàn)下。
怎么更新呢? 原本電腦的上的很多軟件都是通過(guò) brew 進(jìn)行管理,那就用 brew upgrade 升級(jí)下看看唄。
使用 brew upgrade --cask orbsack 后再看下版本,咦!what?為啥沒有更新?隨后上 brew 官網(wǎng)查詢了下 orbstack 的版本1.1.0_16370 。
這就讓我郁悶了,不是能查到最新版本么,為啥不能更新版本? 而且更新的時(shí)候也沒像最開始安裝時(shí)展示些信息,難道是緩存導(dǎo)致?想到這里網(wǎng)上搜索了下 brew 緩存路徑。
通過(guò) cd $(brew --cache) 命令進(jìn)入緩存目錄,在Cask文件里還真有舊版本的安裝包文件,二話不說(shuō)直接刪除文件,然后執(zhí)行brew uninstall orbstack 。 心想這下重新安裝總可以了吧
觀察分析
興致勃勃的來(lái)了個(gè) brew install --cask orbstack 這次仔細(xì)觀察了下 brew 安裝時(shí)的信息,恩哼?what?為啥還是之前的版本?
在疑惑的同時(shí)還注意到brew安裝時(shí)的步驟:
1、先下了一個(gè) orbstack.rb 文件
2、然后在下載 dmg 的安裝包
3、而后再進(jìn)行依賴包下載安裝 (若有)
4、最后安裝軟件。
到這基本可以確定的是 orbstack.rb 文件安裝就是舊版的 orbstack。
再次回到 brew 的緩存目錄,進(jìn)入 downloads 目錄下看到帶很長(zhǎng)校驗(yàn)碼前綴的 orbstack.rb 文件,查看文件內(nèi)容果然寫的就是舊版的。
那怎么辦呢?這會(huì)想起最開始安裝brew時(shí)了解到的信息: 桌面軟件的安裝是由 homebrew-cask 擴(kuò)展來(lái)管理的,而brew本身以及其擴(kuò)展的更新就是 git pull 最新的master分支代碼。
嗯?難道非得更新 brew 來(lái)才能安裝這軟件么?可我不想更新brew ,因?yàn)檫@玩意一更新就更新安裝的其他軟件(雖然可通過(guò)pin來(lái)禁止更新)。
挖坑解決
坑1
這時(shí)候又奇思異想了,直接更新 homebrew-cask 的代碼不就行了?簡(jiǎn)直是一氣呵成,堪稱完美。
cd $(brew --repo homebrew/cask) && git pull && brew install --cask orbstack
看著安裝步驟一步步符合預(yù)期,心想著這總成了吧?what?
突然出現(xiàn)了一行報(bào)錯(cuò):Error: SHA256 mismatch \n Expected:xxx ; Actual:xxx
什么玩意?sha256 不匹配?看到這想到一般文件下載時(shí)都有什么校驗(yàn)碼而且會(huì)用到 sha256算法,然后回到 緩存 downloads 目錄查看 orbstack.rb 文件,版本信息是最新啊。
然后又回到官網(wǎng)orbstack介紹界面,在 /api/cask/orbstack.json 在 ruby_source_checksum 字段找到了報(bào)錯(cuò)信息里 Actual 的校驗(yàn)碼。
難道是哪里還有舊版本的信息沒有更新。關(guān)鍵字 api ? 緩存目錄下不是也有 api 、 api-source . 遍歷下看到幾個(gè) cask 相關(guān) json 文件。
最后在 cask.jsw.json 文件中找到了 Expected的校驗(yàn)碼。那么再更新下這個(gè)文件不就可以安裝新版本了么?那這個(gè)最新文件哪里找呢?
坑2
帶著上述的問(wèn)題,又回到了官網(wǎng)找到所有cask的 cask.json, 下載后打開跟 cask.jsw.json 對(duì)比了下結(jié)構(gòu)還有點(diǎn)不一樣,少了頂層的信息。
卒~~ 那既然全部替換不行那就部分替換唄??jī)H替換 orbstack 部分的信息,但是奈何文件有點(diǎn)大且這段信息還是json的字符串格式,手動(dòng)替換著實(shí)有點(diǎn)難。
觀察json文件 orbstack 信息是在 playload 下數(shù)組中的第n元素,那么只要取出playload循環(huán)遍歷判斷是否包含 orbstack 信息,然后覆蓋值即可。而后備份了源文件,又寫了串java代碼使用 fastjson 把數(shù)據(jù)替換。
再次 brew install --cask orbstack . 然后又出現(xiàn)了新報(bào)錯(cuò),驗(yàn)證完整性失敗(簽名不匹配),還給出地址?整個(gè)人都麻了...
"Failed to verify integrity (signature mismatch) of: https://formulae.brew.sh/api/cask.jws.json "
解決
根據(jù)報(bào)錯(cuò)的地址打開發(fā)現(xiàn)這不正是我需要的那份完整文件么?這程序設(shè)計(jì)的真好,頓時(shí)感覺老香了。
下載替換原始的 cask.jws.json 文件,再次 brew install --cask orbstack .
哈哈,安裝成功!
小結(jié)
不用更新 brew 版本方式升級(jí)其他桌面應(yīng)用軟件,步驟如下(應(yīng)該brew更新的邏輯也是如下吧):
- 通過(guò) git pull 更新桌面應(yīng)用軟件的下載文件,即 homebrew-cask 下各目錄中的 *.rb
- 手動(dòng)下載 cask.jws.json 文件,替換brew緩存目錄下cask.jws.json文件
$HOME/Library/Caches/Homebrew/api/cask.jws.json
最后
為了一個(gè)新軟件的體驗(yàn),然后心驚膽戰(zhàn)的升級(jí)了一波系統(tǒng),然后給又自己挖了兩坑,最后耗時(shí)7、8個(gè)小時(shí)(包括系統(tǒng)升級(jí))才把問(wèn)題解決。
一系列的連鎖反應(yīng),哎!我太難了,沒事體驗(yàn)它干啥玩意?升個(gè)什么玩意最新版本?鬼知道這么折騰后會(huì)不會(huì)有其他問(wèn)題,后續(xù)在研究研究 brew 背后是如何進(jìn)行管理安裝軟件的吧。

浙公網(wǎng)安備 33010602011771號(hào)