news 2026/9/9 22:11:38

Bruno:以纯文本 `.bru` 文件驱动的离线优先开源 API IDE —— 设计理念、跨平台安装与 Git 协作实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bruno:以纯文本 `.bru` 文件驱动的离线优先开源 API IDE —— 设计理念、跨平台安装与 Git 协作实战

Bruno:以纯文本.bru文件驱动的离线优先开源 API IDE —— 设计理念、跨平台安装与 Git 协作实战

【免费下载链接】brunoOpensource IDE For Exploring and Testing API's (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/bruno

Bruno 是当前仓库所承载的开源 API 客户端项目,它的核心理念是“集合即文件夹、请求即纯文本”:集合文件直接存放在本地文件系统中,每一条 API 请求都以一种名为 Bru 的简单纯文本标记语言保存为.bru文件,因此可以无缝交给 Git 等任意版本控制系统做团队协作与变更审阅。本文将以仓库中的巴西葡萄牙语版项目说明(readme_pt_br.md)为主线,完整讲解 Bruno 的设计哲学、.bru文本格式、跨平台安装方式、多平台运行与 Git 协作工作流,并结合仓库源码剖析其底层实现,帮助你快速理解并上手这套“文件优先、完全离线”的 API 开发工具。

Bruno 是什么:对抗“云同步”惯性的 API 客户端

Bruno 是一个致力于改变现状的创新型 API 客户端——现状即由 Postman 等同类工具长期塑造的“账号体系 + 云端同步”模式。与这些工具不同,Bruno 从设计上就选择了另一条路线:

  • 集合直接保存在本地文件夹,不使用中心化的在线存储;
  • 请求信息用Bru 这种纯文本标记语言描述;
  • 通过Git 或任意版本控制系统进行集合的协作与共享;
  • 完全离线运行,项目明确表示“永远不会(never)加入云同步能力”,因为数据隐私应当掌握在用户自己手中、留在用户自己的设备上。

这一“离线优先”的定位并非功能缺陷,而是被刻意坚守的产品边界。仓库中的主项目说明 readme.md 与各语言版本(如 简体中文版、English 版)都反复强调同一理念。

上图取自仓库资源 landing-2.png,展示了 Bruno 的核心工作界面:左侧是存于本地的集合(Collection)树,中间是请求编辑区(方法、URL、请求体),右侧是带状态码与响应体的 Response 面板。集合、请求与响应都在本地完成闭环,不依赖任何远程服务。

核心技术:集合即文件夹,请求即.bru纯文本

Bruno 最独特的工程设计在于它的存储模型:一个 API 集合对应文件系统中的一个目录,目录内的每个请求都是一个.bru文本文件。因为内容是可读的纯文本,所以 diff、review、merge 等 Git 操作对 API 集合而言就和操作普通代码一样自然。

Bru 标记语言的字段结构

仓库中提供了完整的 Bru 格式示例,见 packages/bruno-lang/example/request.bru。一个典型的 HTTP 请求文件长这样:

type http-request name Send Bulk SMS method GET url https://api.textlocal.in/bulk_json?apiKey=secret=&numbers=919988776655&message=hello&sender=600010 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;q=0.9,hi;q=0.8 0 transaction-id {{transactionId}} /headers body(type=json) { "apikey": "secret", "numbers": "+91998877665", ... } /body body(type=graphql) { launchesPast { launch_site { site_name } launch_success } } /body script let user = 'John Doe'; function onRequest(request) { request.body.user = user; } function onResponse(request, response) { expect(response.status).to.equal(200); } /script

从中可以提炼出 Bru 格式的几个关键约定:

  • 顶部键值对声明请求元信息:type(请求类型)、name(名称)、method(HTTP 方法)、urlbody-modeseq(集合内排序序号)等;
  • 区块(Block)用成对标记包裹:如params ... /paramsheaders ... /headersbody ... /bodyscript ... /script
  • 区块内每一行行首的1/0是启用开关:1表示该项启用,0表示禁用(示例中transaction-id {{transactionId}}即为禁用态,仍可随{{transactionId}}这类占位符参与变量插值);
  • body区块通过type=参数区分载荷类型,同一文件可书写type=jsontype=graphql等多种形式;
  • script区块使用 JavaScript 编写请求前置(onRequest)与响应断言(onResponse)脚本,其中{{...}}是环境变量引用语法。

从源码看.bru的解析与类型映射

Bru 并不是“注释式约定”的伪格式,而是有完整语言工具链支撑的正式格式。仓库中以独立包形态维护了解析器与转换器:

  • packages/bruno-lang:Bru 语言工具包,其 v2 实现(bruToJson.js 等)负责.bru文本 ↔ JSON 的双向转换;
  • bruno-filestore 的 bru 格式解析:桌面应用读写集合时调用的高层封装。

以解析入口parseBruRequest为例,可以看到文件读取后被转换成的内部 JSON 形态,以及meta.type与请求类型的映射规则:

  • httphttp-request
  • graphqlgraphql-request
  • grpcgrpc-request
  • wsws-request
  • 缺省情况下统一回落为http-request

同时,该方法还会从 JSON 中提取meta.seq(排序号,非数字时默认1)、meta.tagssettings,并对http.method做大写归一化——源码注释特别说明:自定义方法采用直接取值而非upperCase,是为了保留特殊字符不被破坏。也就是说,你在界面中编辑请求,底层本质上是在编辑并序列化这一份结构化的文本模型。

结合 formats 目录 可以看到仓库同时支持bruyml两种存储方言,Bruno 也因此在“保留文件即保留数据”的前提下提供了面向团队习惯的灵活性。

基于 Git 的团队协作:API 集合进入版本控制工作流

因为集合就是文件夹、请求就是文本文件,Bruno 团队协作的方式和代码协作完全同构:用 Git 或任意你喜欢的版本控制工具来协作维护 API 集合。你可以把某个集合目录作为 Git 仓库(或仓库子目录)提交,成员之间通过 Pull Request / Merge Request 来审阅 API 变更。

上图来自仓库资源 version-control.png,展示的是一个典型的 PR 审阅场景:变更文件是Get Users.bru与嵌套目录User/Get Users.bru,diff 面板中以绿色高亮新增的请求定义(meta信息 + HTTP 方法与 URL)。对团队而言这意味着:

  • 集合变更可以走代码评审流程,做到“改 API 与改代码同权同责”;
  • 每个历史版本、每次合并都有完整留痕,可随时回溯与回滚;
  • 请求、环境、脚本等全部落到可审查的文本,不再依赖工具的导出/导入或中心化历史记录。

这种“API 定义即代码”的模式,正是 Bruno 与“云同步账号体系”工具在协作形态上的本质差异。

离线优先与数据隐私:为什么“永不云同步”反而是特性

项目说明明确表达了对数据隐私的立场:Bruno 完全离线,且未来也没有加入云同步的计划,数据应始终保留在使用者的设备上。这也解释了它在工程上的一切选择:

  • 没有“登录账号才能使用”的强制前提,打开即用本地集合;
  • 同步与共享的职责被让渡给 Git 等用户自选工具,数据流向由团队自行掌控,而非第三方服务;
  • 隐私边界清晰:本地明文、可控备份、可离线审计。

从仓库结构看,这一立场同样体现在发布物上:桌面端实现集中在 packages/bruno-electron,而面向自动化场景的 packages/bruno-cli 让同一批本地集合可被命令行直接驱动——所有能力都建立在“本地文件即真源”这一前提之上,不依赖任何在线状态。

安装 Bruno:二进制下载与跨平台包管理器

项目说明提供了两种安装途径:一是官网二进制下载(Mac / Windows / Linux 桌面安装包);二是通过各大平台的包管理器安装。以下命令完整来自 readme_pt_br.md:

# Mac 上通过 Homebrew brew install bruno # Windows 上通过 Chocolatey choco install bruno # Windows 上通过 Scoop scoop bucket add extras scoop install bruno # Windows 上通过 winget winget install Bruno.Bruno # Linux 上通过 Snap snap install bruno # Linux 上通过 Flatpak flatpak install com.usebruno.Bruno # Linux 上通过 Apt(Debian/Ubuntu 系) sudo mkdir -p /etc/apt/keyrings sudo apt update && sudo apt install gpg curl curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x9FA6017ECABE0266" \ | gpg --dearmor \ | sudo tee /etc/apt/keyrings/bruno.gpg > /dev/null sudo chmod 644 /etc/apt/keyrings/bruno.gpg echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" \ | sudo tee /etc/apt/sources.list.d/bruno.list sudo apt update && sudo apt install bruno

对 Linux 的 Apt 安装稍作拆解,便于理解每一步作用:

  1. 创建keyrings目录并安装gpgcurl
  2. 从 Ubuntu keyserver 拉取 Bruno 的 GPG 签名公钥,gpg --dearmor将其转换为二进制格式,写入/etc/apt/keyrings/bruno.gpg
  3. 设置文件权限为644,使所有用户可读;
  4. 新增 apt 源文件/etc/apt/sources.list.d/bruno.list,声明signed-by指向刚导入的密钥;
  5. apt update后安装bruno

仓库根目录的主说明 readme.md 中还额外给出了 Arch Linux 通过 AUR 安装的示例(yay -S bruno),使用 AUR 的用户可参考。安装完成后,即可打开 Bruno 创建或克隆集合目录,开始本地请求调试。

同一份集合,多平台运行

Bruno 提供跨 macOS、Windows、Linux 的桌面客户端,同一份本地集合可以在任意平台打开与执行,无需转换格式。

上图为仓库中的多平台运行示意 run-anywhere.png。从工程实现看,“同一套集合、多端运行”依赖分层清晰的代码组织:桌面应用(packages/bruno-app)承载界面与交互,Electron 主进程与 IPC 层位于 packages/bruno-electron,而请求解析、Bru 语言与通用逻辑分别沉淀在 bruno-filestore、bruno-lang 与 bruno-common 等独立包中。由于存储格式统一、解析逻辑收敛于共享包,不同平台上的行为才能保持一致,这也是“跨平台运行 + 纯文本存储”能够成立的基础。

仓库内配套资源导读

围绕主说明,仓库还提供了若干可直接查阅的配套文档与代码,按需深入即可:

  • 主项目说明:readme.md(英文版),以及 docs/readme 目录下的 20 余种语言翻译版(含 中文简体、中文繁体);
  • 贡献指南:contributing_pt_br.md(葡萄牙语版贡献指南),其余语言版本位于 docs/contributing;
  • 发布到新包管理器:当社区希望把 Bruno 上架到更多包管理器时,需遵循 publishing_pt_br.md 中的流程;
  • Bru 格式示例与语言实现:示例请求文件、语言工具包、filestore 解析实现;
  • 许可证:license.md(MIT)。

商标与许可证

  • 名称商标Bruno是 Anoop M D 的注册商标;
  • Logo 来源:Logo 图样源自 OpenMoji,采用 CC BY-SA 4.0 许可;
  • 项目许可证:整体代码以 MIT 许可证 开源。

如何参与贡献

如果你希望以代码方式改进 Bruno,可以参考 葡萄牙语版贡献指南(以及 docs/contributing 下对应语言版本)。即使不以代码参与,也可以在日常使用中反馈 Bug、提出符合自身场景的功能诉求——这些同样是对项目的重要贡献。若你在使用中希望验证或自动化执行本地集合,仓库中还提供了 bruno-cli 与npm install -g @usebruno/cli的命令行运行途径,可与桌面端共用同一份.bru集合,进一步打通“本地编辑 + CI/CD 执行”的离线优先工作流。

【免费下载链接】brunoOpensource IDE For Exploring and Testing API's (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/bruno

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 22:10:20

把微信聊天记录存成网页、文档和表格:WeChatMsg免费工具上手教程

把微信聊天记录存成网页、文档和表格:WeChatMsg免费工具上手教程 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/9/9 22:09:57

五子棋胜负判断:方向数组与矩阵遍历的核心解法

2023B卷的这道“五子棋迷”,我第一眼看到题目名字的时候,还以为是让写一个能自己下棋的AI。结果读完题面才发现,它只是让你判断一个已经摆好的棋盘上,黑棋还是白棋已经连成了五个子。题面本身不算复杂,但如果你没把矩阵…

作者头像 李华
网站建设 2026/9/9 22:09:38

NeMo Voice Agent 实战指南:3步在本地跑通全开源语音助手

NeMo Voice Agent 实战指南:3步在本地跑通全开源语音助手 【免费下载链接】Speech A scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Te…

作者头像 李华
网站建设 2026/9/9 22:09:36

如何用 Ant Design CLI 离线查询组件 API、Demo 与 Design Token

如何用 Ant Design CLI 离线查询组件 API、Demo 与 Design Token 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/GitHub_Trending/an/ant-design 在编写或维护基于 Ant Design(an…

作者头像 李华
网站建设 2026/9/9 22:07:09

OpenSim外部几何模型导入:从STL预处理到XML挂载全指南

简介:面向OpenSim生物力学建模初学者与研究人员,这份资源演示了在OpenSim 4.1环境下为leg6dof9musc腿部六自由度九肌肉模型添加外部几何模型的具体过程。压缩包共3个文件,包括原始OSIM模型文件、STL格式的示例外部几何体,以及用于…

作者头像 李华
网站建设 2026/9/9 22:05:43

Android三维模型加载实战:用JPCT-AE快速渲染OBJ模型

简介:这是一份面向Android开发者的JPCT三维模型加载示例工程,围绕OpenGL ES渲染、GLSurfaceView视图与JPCT API展开,详细覆盖从模型导入、场景构建、渲染循环到触摸交互的完整链路。项目自带名为“3DTest”的完整实例,可直接查看W…

作者头像 李华