news 2026/10/4 5:27:26

OpenNOW开发者指南:从零构建、跑通验收测试与贡献你的第一个Pull Request

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenNOW开发者指南:从零构建、跑通验收测试与贡献你的第一个Pull Request

OpenNOW开发者指南:从零构建、跑通验收测试与贡献你的第一个Pull Request

【免费下载链接】OpenNOWCustom GeForce Now Client Named OpenNOW项目地址: https://gitcode.com/gh_mirrors/op/OpenNOW

OpenNOW 是一个开源的 GeForce NOW 桌面客户端,使用 Qt Quick 构建界面、Rust 负责账号服务与串流。本文是面向新手的OpenNOW 开发者指南:带你完成从零构建、跑通本地与验收测试,并一步步提交你的第一个 Pull Request,帮助你快速上手这个项目的贡献流程。

一、先认清仓库结构:OpenNOW 由哪些部分组成

动手前,先花 2 分钟了解代码在哪里。OpenNOW 仓库分为几大块,各司其职:

目录技术栈职责
opennow-qt/Qt 6 + C++20 + QML桌面应用界面、输入、串流渲染集成与 Qt 测试
native/opennow-core/Rust账号、设置、目录、会话编排等应用核心服务
native/opennow-streamer/RustNVST 串流传输、解码、音频、输入与 Qt FFI
locales/JSON英文源文案 + Crowdin 管理的多语言翻译
docs/Markdown协议、验收、发布等架构文档

架构上,Qt 只负责绘制窗口与交互;Rust 核心在独立进程中运行,两者通过带版本的 JSON 协议通信,协议细节见 docs/core-protocol.md。串流部分则以版本化 C ABI 的方式嵌入 Qt 进程,视频全程留在 GPU 上。

二、从零构建:安装依赖并完成第一次编译

🛠️ 构建 OpenNOW 需要以下工具链(构建和运行桌面端不需要Node.js 或 npm):

  • Qt 6.8+(含 Quick、Multimedia、ShaderTools)
  • CMake 3.24+ 与 C++20 工具链
  • SDL3、Cargo(Rust)及平台媒体依赖
  • Linux 还需pkg-config、libwayland-dev、wayland-protocols(X11 构建也要求安装)

一键克隆与配置

在终端中依次执行:

git clone https://gitcode.com/gh_mirrors/op/OpenNOW cd OpenNOW cmake -S opennow-qt -B build/opennow-qt -DCMAKE_BUILD_TYPE=Debug cmake --build build/opennow-qt

配置时使用main分支获取发布源码,dev分支则是持续开发中的版本。macOS 用户的完整构建步骤(含CMAKE_OSX_ARCHITECTURES与打包命令)参考 opennow-qt/README.md 的 Build 章节。

没有 GFN 账号也能验证构建

登录和实际游戏需要自己的 GeForce NOW 账号;但即使没有账号,你依然可以运行冒烟测试、截图夹具和性能检查——这正是项目测试体系对新手最友好的地方。

三、跑通验收测试:像 CI 一样验证你的构建

✅ OpenNOW 的测试分为几层,你只需要按顺序执行,就能在本地复刻大部分 CI 检查:

第 1 步:运行完整 Qt 测试套件

ctest --test-dir build/opennow-qt --output-on-failure

第 2 步:运行 Rust 核心与串流器测试

cargo test --manifest-path native/opennow-core/Cargo.toml cargo test --manifest-path native/opennow-streamer/Cargo.toml --workspace

第 3 步:可选——无账号冒烟测试

使用 offscreen 平台插件做启动冒烟测试,无需登录即可截图验证:

QT_QPA_PLATFORM=offscreen ./build/opennow-qt/opennow-qt \ --smoke-test --allow-multiple-instances --route home

几个实用技巧(均来自 opennow-qt/README.md):

  • 开发开关:--route <name>打开指定页面、--overlay <name>打开浮层、--screenshot <png>保存截图
  • 主题检查:ctest --test-dir build/opennow-qt -R 'theme-tests|qml-theme-settings'
  • CI 的 headless 测试只跑ci-unit标签的用例;需要真实桌面交互的用例在interactive-desktop标签下,二者互不替代

关于"发布前必须验证什么",项目的完整验收矩阵写在 docs/qt-acceptance.md,它是理解 OpenNOW 质量门槛的最佳入口。

四、了解 CI 检查:你的提交会经历什么

提交 PR 后,qt-ci工作流会在 Linux x64、Windows x64、macOS ARM64 上并行运行:工作流 lint、打包契约测试、本地化校验,随后是 Rust 格式化/静态检查/测试 + QML 语法检查 +ci-unitQt 测试。三个平台的状态检查(linux-x64、windows-x64、macos-arm64)都是合入dev/main的必需条件。

⚠️ 注意:完整应用构建、ARM64 交叉编译和打包只在手动派发时执行——如果你的改动涉及这些路径,合入前请先手动跑一次构建。CI 的缓存与性能策略可参考 docs/ci-performance.md。

五、贡献你的第一个 Pull Request 🚀

OpenNOW 的贡献规范集中在 .github/CONTRIBUTING.md 与 AGENTS.md 两份文档中,建议通读后再动手。核心要点:

  1. 建特性分支,保持每次提交聚焦单一改动
  2. 先跑最小相关测试:改动 Qt 就跑对应ctest -R用例,改动 Rust 就跑对应 crate 测试;有条件时再跑完整套件
  3. 本地化特殊规则:只编辑 locales/en.json,其他语言文件由 Crowdin 生成,禁止手改;改完后运行npm run locales:check校验(这是仓库中少数需要 Node.js 的场景)
  4. 提交 PR时使用简洁的变更摘要(模板见 .github/PULL_REQUEST_TEMPLATE.md),把一次性的验证截图作为附件上传,而不是提交进仓库
  5. 报 Bug 时附上构建版本、系统、GPU 与复现步骤;串流类问题请先在 设置 → 关于 → 复制诊断 导出诊断报告,并注意检查其中的隐私信息

新手友好切入点清单

  • QML 界面调整:改 opennow-qt/qml/ 下的组件,配合冒烟测试截图自测
  • 文案修复:仅改 locales/en.json,门槛最低
  • 文档完善:docs/ 下的架构与验收文档
  • 测试补充:opennow-qt/tests/ 下有大量 QML 验收用例可参考写法

六、常用参考文档速查

文档内容
opennow-qt/README.md构建、冒烟测试、诊断与功能说明总入口
docs/qt-acceptance.md验收手册:每个功能需要哪些证据
docs/core-protocol.mdQt 壳层与 Rust 核心的 JSON 协议
native/opennow-streamer/README.md原生串流器的图形后端与 FFI 说明
docs/qt-migration.md从 Electron 迁移到 Qt 的历史与遗留清单

从零构建、跑通测试、发出第一个 PR——你现在已经掌握了 OpenNOW 贡献所需的完整路径。记住 AGENTS.md 里的核心优先级:性能优先、可靠优先、行为可预测。祝你的第一个 Pull Request 顺利合入!

【免费下载链接】OpenNOWCustom GeForce Now Client Named OpenNOW项目地址: https://gitcode.com/gh_mirrors/op/OpenNOW

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

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

IEEE 39节点系统MATLAB建模实战:从数据解析到潮流仿真全流程

搞电力系统科研或者工程仿真的人&#xff0c;十有八九绕不开一个名字&#xff1a;IEEE 10机39节点系统。它是业内公认的经典测试系统&#xff0c;学名也叫New England 39-Bus System&#xff0c;脱胎于上世纪六七十年代新英格兰地区实际电网的简化拓扑&#xff0c;后来被无数论…

作者头像 李华
网站建设 2026/10/4 5:26:28

JavaWeb 后端调翻译 API 实战:Servlet 集成与避坑指南

简介&#xff1a;这份资源面向JavaWeb初学者与课程设计开发者&#xff0c;围绕“调取第三方API实现翻译功能”这一典型场景&#xff0c;提供一套可运行、可参考的完整项目源码。内容涵盖前端Cookie缓存、后端Servlet与JSP协同、Redis缓存翻译结果、MVC分层架构&#xff0c;以及…

作者头像 李华
网站建设 2026/10/4 5:26:15

基于Django与深度学习的上课学生行为识别系统实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 5:24:43

RAG检索主链路实战:LangGraph+Milvus+Ollama+SSE流式问答

1. 检索主链路到底在搭什么&#xff1a;从“能聊”到“能查”的分水岭很多人做企业级问答系统&#xff0c;卡在第三章、第四章就停了——模型接上了&#xff0c;Prompt 调通了&#xff0c;单轮对话也能跑&#xff0c;但一旦问它“我们公司去年Q3的差旅报销标准是多少”&#xf…

作者头像 李华
网站建设 2026/10/4 5:23:39

MRAM+ARM Cortex-M4工业存储方案实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 5:23:11

有限元法离散化本质:从物理真实到数值可解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华