與測試客戶端深度解析:基于 Bru 文件的本地存儲、Git 協(xié)作與全平臺安裝指南)
Bruno 開源 API 開發(fā)與測試客戶端深度解析基于 Bru 文件的本地存儲、Git 協(xié)作與全平臺安裝指南【免費(fèi)下載鏈接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)項(xiàng)目地址: https://gitcode.com/GitHub_Trending/br/bruno本文圍繞倉庫中的波斯語 READMEdocs/readme/readme_fa.md展開全面講解 Bruno 這一開源 API 客戶端的核心設(shè)計(jì)理念——集合即文件系統(tǒng)上的文本文件包括其Bru 標(biāo)記語言的存儲格式、離線優(yōu)先與數(shù)據(jù)隱私立場、基于Git 的團(tuán)隊(duì)協(xié)作模式以及 macOS / Windows / Linux 三平臺的多種安裝方式并結(jié)合倉庫源碼packages/bruno-lang等給出可驗(yàn)證的實(shí)現(xiàn)依據(jù)。1. Bruno 是什么重新定義 API 客戶端Bruno 是一個(gè)開源的 API 客戶端項(xiàng)目自我定位為 Postman 等同類工具的變革者倉庫描述將其歸為 Postman / Insomnia 的輕量級替代方案用于 API 的探索、開發(fā)與測試。它的與眾不同之處并不在于能發(fā)請求而在于數(shù)據(jù)存儲方式與協(xié)作模式從根本上與主流工具不同。與其把請求集合鎖在云端數(shù)據(jù)庫里Bruno 選擇了一條完全相反的技術(shù)路線見 readme_fa.md 中????? ????????? ??? ?? ???????? ?? ?? ???? ??? ????????? ??? ????? ?????一節(jié)你的 API 集合被直接保存在文件系統(tǒng)的一個(gè)文件夾中集合中的每個(gè)請求對應(yīng)一個(gè)使用純文本標(biāo)記語言Bru編寫的文件。這一設(shè)計(jì)帶來兩個(gè)立竿見影的效果集合就是你手邊的普通文件可以用任意編輯器查看、diff、批量替換版本控制天然可用因?yàn)榧鲜俏谋疚募it diff、git log、分支與合并都能精確到請求級別這為下文第 3 節(jié)的Git 協(xié)作奠定了基礎(chǔ)。倉庫的根目錄 readme.md 與波斯語翻譯版在這一點(diǎn)上的描述完全一致可見這是整個(gè)項(xiàng)目最核心的架構(gòu)決策。1.1 項(xiàng)目倉庫全景當(dāng)前倉庫是一個(gè)monorepo以packages/目錄組織多個(gè)子包從倉庫目錄結(jié)構(gòu)可以看到與本主題直接相關(guān)的核心模塊目錄職責(zé)結(jié)合源碼結(jié)構(gòu)推斷packages/bruno-app基于 React 的桌面端 UI包含src/components、src/pages、src/providers等大量源碼packages/bruno-electronElectron 桌面外殼與 IPC / 文件系統(tǒng)服務(wù)src/ipc、src/services、src/storepackages/bruno-langBru 語言的解析器與序列化工具負(fù)責(zé).bru文件與內(nèi)部 JSON 模型的互轉(zhuǎn)packages/bruno-cli命令行運(yùn)行器用于在無 GUI 環(huán)境下執(zhí)行集合packages/bruno-common跨端共享的類型定義與工具其中packages/bruno-lang正是集合即文本這一核心設(shè)計(jì)的地基我們在下一節(jié)結(jié)合它的源碼與測試樣例深入展開。上圖來自倉庫 assets/images 目錄是 Bruno 主界面在倉庫 README如 readme_fa.md 中[](https://link.gitcode.com/i/d3ac147c57548796df28474f59d04a3f)中使用的產(chǎn)品截圖用于展示其完整的請求編輯與響應(yīng)查看工作區(qū)。2. Bru 標(biāo)記語言集合的文本存儲格式2.1 Bru 是什么Bru 是 Bruno 自研的一種純文本標(biāo)記語言用于把一次 API 請求的全部信息方法、URL、請求頭、Query 參數(shù)、請求體、腳本、斷言等記錄為可讀、可 diff 的文本。這意味著集合無需專用數(shù)據(jù)庫一個(gè)普通文件夾 若干.bru文件就是一個(gè)完整集合。倉庫中提供了一個(gè)非常直觀的示例文件 packages/bruno-lang/example/request.bru其內(nèi)容展示了經(jīng)典 Bruv1書寫風(fēng)格type http-request name Send Bulk SMS method GET url https://api.textlocal.in/bulk_json?apiKeysecretnumbers919988776655messagehellosender600010 body-mode json seq 1 params 1 apiKey secret 1 numbers 998877665 1 message hello /params headers 1 content-type application/json 1 accept-language en-US,en;q0.9,hi;q0.8 0 transaction-id {{transactionId}} /headers body(typejson) { apikey: secret, numbers: 91998877665, data: { sender: TXTLCL, messages: [{ numbers: 91998877665, message: Hello World }] } } /body在這個(gè)示例中可以看到幾個(gè)值得注意的要點(diǎn)元信息區(qū)以type http-request標(biāo)識這是一個(gè) HTTP 請求文檔鍵值對區(qū)params / headers通過params ... /params、headers ... /headers這樣的成對標(biāo)簽包裹列表行內(nèi)行的語義在headers與params中每行形如標(biāo)志位 鍵 值其中標(biāo)志位1表示啟用、0表示禁用例如示例中0 transaction-id {{transactionId}}表示該頭當(dāng)前被禁用同時(shí){{transactionId}}展示了 Bruno 的模板插值變量引用語法帶類型的 body 區(qū)body(typejson)之后緊跟原始 JSON 內(nèi)容用/body結(jié)束支持同一請求文件里并列多種 body 類型示例中同時(shí)給出了 json 與 graphql 兩種 body腳本區(qū)script ... /script中可編寫onRequest、onResponse等鉤子函數(shù)示例中onResponse內(nèi)通過expect(response.status).to.equal(200)對響應(yīng)狀態(tài)碼做了斷言這直接對應(yīng) Bruno 的腳本與測試能力。2.2 Bru 語法解析的源碼實(shí)現(xiàn)從源碼結(jié)構(gòu)看Bruno 在 packages/bruno-lang 中維護(hù)了兩代 Bru 解析實(shí)現(xiàn)v1 解析器位于 packages/bruno-lang/v1/src目錄下文件如params-tag.js、headers-tag.js、body-tag.js、script-tag.js、env-vars-tag.js、key-val-lines.js等與上面 2.1 節(jié)的標(biāo)簽結(jié)構(gòu)一一對應(yīng)——params/headers這類鍵值對區(qū)塊由key-val-lines.js配合各 tag 文件處理body、script則有獨(dú)立解析單元驗(yàn)證了 Bru 是按標(biāo)簽分塊的文本語法v2 解析器位于 packages/bruno-lang/v2/src提供bruToJson.js、jsonToBru.js、jsonToCollectionBru.js、envToJson.js、dotenvToJson.js等轉(zhuǎn)換模塊說明 Bru 文件與內(nèi)部 JSON 模型之間存在雙向轉(zhuǎn)換管線測試樣例packages/bruno-lang/v2/tests/fixtures/request.bru 展示了新一代 Bru 的YAML 風(fēng)格塊語法使用meta { ... }、get { url: ... }、params:query { ... }、auth:oauth2 { ... }、body:json { ... }、assert { ... }等花括號塊代替 v1 的標(biāo)簽/標(biāo)簽配對并用~前綴表示禁用某一行collection.bru 則展示了集合級的meta { type: collection }、繼承給請求的headers、auth、vars:pre-request、script:post-response等默認(rèn)配置如何落盤為文本。// 來自 packages/bruno-lang/v2/tests/fixtures/request.bru 的 v2 風(fēng)格摘錄 meta { name: Send Bulk SMS type: http seq: 1 } get { url: https://api.textlocal.in/send/:id body: json auth: bearer } params:path { id: 123 } auth:oauth2 { grant_type: authorization_code authorization_url: http://localhost:8080/api/auth/oauth2/authorization_code/authorize access_token_url: http://localhost:8080/api/auth/oauth2/authorization_code/token client_id: client_id_1 client_secret: client_secret_1 pkce: false auto_fetch_token: true }由上述兩代語法樣本與對應(yīng)的解析器/測試文件可以看出無論 Bru 語言如何演進(jìn)把請求以可讀文本落盤到普通文件夾的架構(gòu)始終未變——這正是一切 Git 協(xié)作與離線能力的根基。3. 離線優(yōu)先為什么 Bruno 永不強(qiáng)制云端在 readme_fa.md 的說明中有一句非常關(guān)鍵的產(chǎn)品立場聲明Bruno 只以離線offline方式工作未來也不計(jì)劃加入任何云端同步功能。團(tuán)隊(duì)珍視用戶的數(shù)據(jù)隱私認(rèn)為你的集合數(shù)據(jù)應(yīng)當(dāng)留在你自己的設(shè)備上。這條原則與第 2 節(jié)集合以文本文件存放在本地文件系統(tǒng)的架構(gòu)互為因果沒有云端數(shù)據(jù)庫就不存在數(shù)據(jù)上云的隱私與合規(guī)顧慮團(tuán)隊(duì)如果想跨機(jī)器共享集合不依賴廠商的同步服務(wù)而是自己掌控載體——通常是Git 倉庫詳見第 4 節(jié)敏感信息如示例中的 token、密碼始終位于團(tuán)隊(duì)自己的版本庫與設(shè)備中。也就是說本地優(yōu)先 Git 協(xié)作不是妥協(xié)而是 Bruno 針對 API 集合協(xié)作問題給出的明確架構(gòu)答案這也直接決定了它的使用方式與 Postman 等需要登錄并同步到云端的工具截然不同。4. 借助 Git 進(jìn)行團(tuán)隊(duì)協(xié)作既然集合是文件系統(tǒng)中的一個(gè)普通文件夾那么協(xié)作方式就順理成章使用 Git或任何你偏好的版本控制系統(tǒng)。將集合目錄納入 Git 倉庫后團(tuán)隊(duì)可以享受到文本文件協(xié)作的全部紅利代碼評審式的集合審查對某個(gè)請求的修改可以像改代碼一樣發(fā)起 Pull Request / Merge Request逐行審閱 Bru 文件的改動(dòng)精確的變更歷史git log能追蹤到誰在何時(shí)改動(dòng)了哪個(gè)請求頭、哪個(gè) URL無沖突的并行開發(fā)不同成員各改各的.bru文件沖突合并比二進(jìn)制或云端存儲簡單得多與現(xiàn)有研發(fā)流程無縫集成集合跟著代碼倉庫走分支、標(biāo)簽、回滾、CI 觸發(fā)都復(fù)用同一套基建。倉庫目錄中 packages/bruno-appIDE 前端與 packages/bruno-electron桌面外殼及其src/ipc、src/store等文件系統(tǒng)相關(guān)模塊中包含了集合的裝載、監(jiān)控與寫入邏輯可以印證集合在本地文件系統(tǒng)上實(shí)時(shí)讀寫這條鏈路是 Bruno 運(yùn)行時(shí)的核心路徑。上圖來自倉庫 assets/images 目錄用于說明集合作為文件夾/文本文件被 Git 跟蹤、評審與版本管理的協(xié)作方式。5. 跨平臺支持readme_fa.md 中單獨(dú)用一節(jié)強(qiáng)調(diào) Bruno在多個(gè)平臺上運(yùn)行??? ????????? ????? ??? ?????。從倉庫結(jié)構(gòu)看Bruno 的核心邏輯分為共享的packages/bruno-appUI與packages/bruno-electron桌面運(yùn)行外殼這種架構(gòu)天然支持各桌面平臺共用同一套代碼而命令行的執(zhí)行能力則沉淀在packages/bruno-cli可運(yùn)行在服務(wù)器與 CI 環(huán)境進(jìn)一步拓寬了跨平臺的邊界。作為開發(fā)者你可以按需選用在桌面端進(jìn)行交互式探索與調(diào)試在命令行或 CI 中執(zhí)行同一套基于 Bru 文件的集合做回歸測試——兩端的輸入輸出模型一致因?yàn)樗鼈兿M(fèi)的是同一套文本集合。上圖同樣出自 assets/images 目錄的 README 配圖示意 Bruno 客戶端可運(yùn)行于多類桌面操作系統(tǒng)。6. 安裝指南macOS / Windows / Linux6.1 二進(jìn)制安裝包官方為macOS、Windows 與 Linux提供了現(xiàn)成的二進(jìn)制安裝包可從官網(wǎng)下載頁面直接獲取對應(yīng)平臺的安裝文件在 readme_fa.md 中被列為最直接的安裝途徑。6.2 通過包管理器安裝除二進(jìn)制包外官方還支持多種主流包管理器。原文給出了四條最常用的命令下面逐一展開并補(bǔ)充說明# macOS —— 通過 Homebrew brew install bruno # Windows —— 通過 Chocolatey choco install bruno # Linux —— 通過 Snap snap install bruno在 Linux 上Snap 安裝通常需要系統(tǒng)已啟用 snapd 服務(wù)若你的發(fā)行版未預(yù)裝 snapd需先安裝并啟用它再執(zhí)行上述命令。倉庫英文主 READMEreadme.md中還額外列出了 Windows 的Scoop / winget、Linux 的Flatpak、Arch Linux 的AUR等途徑如scoop install bruno、winget install Bruno.Bruno、flatpak install com.usebruno.Bruno、yay -S bruno需要更多發(fā)行版覆蓋時(shí)可一并參考。6.3 Linux 下通過 AptDebian / Ubuntu安裝針對 Debian / Ubuntu 系發(fā)行版官方推薦通過 Apt 安裝完整步驟如下自 readme_fa.md 原樣繼承# 1. 創(chuàng)建 keyring 目錄 sudo mkdir -p /etc/apt/keyrings # 2. 更新軟件源并安裝 gpg 與 curl sudo apt update sudo apt install gpg curl # 3. 導(dǎo)入官方 GPG 公鑰并寫入 keyring curl -fsSL https://keyserver.ubuntu.com/pks/lookup?opgetsearch0x9FA6017ECABE0266 \ | gpg --dearmor \ | sudo tee /etc/apt/keyrings/bruno.gpg /dev/null # 4. 為 keyring 設(shè)置讀取權(quán)限 sudo chmod 644 /etc/apt/keyrings/bruno.gpg # 5. 寫入官方 Apt 軟件源amd64 echo deb [archamd64 signed-by/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable \ | sudo tee /etc/apt/sources.list.d/bruno.list # 6. 更新軟件源并安裝 bruno sudo apt update sudo apt install bruno對以上步驟做幾點(diǎn)實(shí)操補(bǔ)充步驟 3 中0x9FA6017ECABE0266是軟件源簽名所用的 GPG 公鑰指紋安裝前請確認(rèn)該指紋可信步驟 5 的signed-by指向步驟 3 生成的 keyring 文件若自定義過 keyring 路徑需保持一致若 CPU 架構(gòu)非 amd64需確認(rèn)官方源是否提供對應(yīng)架構(gòu)的arch條目后再修改源配置安裝完成后即可從應(yīng)用菜單啟動(dòng) Bruno或通過終端命令直接喚起。7. 入門之后的進(jìn)階資源readme_fa.md 在正文后整理了一組重要入口此處按其在倉庫內(nèi)的對應(yīng)關(guān)系整理為便于索引的清單官方文檔與使用手冊覆蓋 Bru 語法、腳本 API、環(huán)境變量等完整說明建議作為日常查閱的一手資料長期愿景討論與路線圖了解離線優(yōu)先、無云同步等決策背后的完整論證上述產(chǎn)品立場即源于此發(fā)布 / 價(jià)格與下載頁關(guān)注免費(fèi)與付費(fèi)功能邊界以及各平臺最新版本使用案例與經(jīng)驗(yàn)分享倉庫鼓勵(lì)用戶在討論區(qū)分享 Bruno 幫助到實(shí)際工作的場景可作為評估與選型的參考。若你希望在新的包管理器中分發(fā) Bruno如把.bru生態(tài)接入某發(fā)行版?zhèn)}庫或自建源請參考倉庫根目錄的 publishing.md其中說明了發(fā)布到新包管理器的流程與約定英文主 readme.md 的對應(yīng)章節(jié)也提供了同樣指引。8. 參與貢獻(xiàn)與品牌許可8.1 如何貢獻(xiàn)項(xiàng)目歡迎一切形式的貢獻(xiàn)。如果你希望從代碼層面改進(jìn) Bruno請先閱讀倉庫根目錄的 contributing.md 及其多語言版本本項(xiàng)目對應(yīng)的波斯語版位于 docs/contributing/contributing_fa.md。即使你不寫代碼也可以通過報(bào)告 Bug、提交 Feature Request的方式幫助項(xiàng)目——凡是能解決真實(shí)使用場景的反饋都同樣有價(jià)值。對波斯語使用者上述貢獻(xiàn)指南的波斯語譯本已隨倉庫分發(fā)降低了本地化貢獻(xiàn)的門檻。8.2 品牌與開源許可商標(biāo)TrademarkBruno是由 Anoop M D 持有的注冊商標(biāo)Logo源自 [OpenMoji] 項(xiàng)目采用 CC BY-SA 4.0 許可代碼許可倉庫整體以MIT 許可開源詳見倉庫根目錄的 license.md。從許可組合可以看出項(xiàng)目代碼對社區(qū)高度開放MIT同時(shí)通過商標(biāo)條款保護(hù)Bruno這一名稱不被濫用屬于典型的開放代碼 受控品牌治理模式。9. 小結(jié)從文檔到代碼的關(guān)鍵結(jié)論回到 docs/readme/readme_fa.md 這份波斯語 README全文的技術(shù)主線可以濃縮為四句話Bruno 是開源的 API 探索與測試 IDE目標(biāo)是為 Postman 等工具提供不一樣的替代方案集合 文件系統(tǒng)文件夾中的.bru純文本文件這一架構(gòu)由 packages/bruno-lang 中的兩代解析器v1/src 與 v2/src及配套測試夾具如 request.bru、collection.bru實(shí)證支撐離線優(yōu)先、不搞云同步數(shù)據(jù)隱私與本地所有權(quán)是產(chǎn)品的一等公民Git 是推薦的協(xié)作方式配合多平臺支持與 Homebrew / Chocolatey / Snap / Apt 等安裝通道個(gè)人與團(tuán)隊(duì)都可以低成本上手。對于想深入知其所以然的讀者建議順著packages/bruno-lang的解析器與測試、packages/bruno-app與packages/bruno-electron的 UI 與文件讀寫鏈路繼續(xù)閱讀源碼你會對文本即集合這套設(shè)計(jì)有更具體的體感。【免費(fèi)下載鏈接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)項(xiàng)目地址: https://gitcode.com/GitHub_Trending/br/bruno創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考