news 2026/10/16 2:38:23

从Web到桌面:CC-Viewer Electron打包、macOS代码签名与公证的完整实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从Web到桌面:CC-Viewer Electron打包、macOS代码签名与公证的完整实践

【免费下载链接】cc-viewer

A request monitoring system for Claude Code that captures and visualizes all API requests and responses in real time. Helps developers monitor their Context for reviewing and debugging during Vibe Coding.

项目地址:https://gitcode.com/gh_mirrors/cc/cc-viewer
点击查看免费下载

CC-Viewer(cc-viewer)是一款面向 Claude Code 的请求监控系统,能实时捕获并可视化所有 API 请求与响应,帮助开发者在 Vibe Coding 过程中审查与调试上下文。它原生形态是 Web 应用,而本文带你走通CC-Viewer Electron 打包全流程:如何把 Web 应用装进桌面壳、如何用 electron-builder 产出安装包,以及macOS 代码签名与公证(Notarization)的最快配置方法。

桌面版架构:Web 应用如何装进 Electron

CC-Viewer 桌面端采用「npm 包载荷 + Electron 外壳」的组合架构,核心思路只有一条:

  • 载荷(payload):packages/app即发布到 npm 的完整应用(server、前端 dist、CLI、拦截器等);
  • 外壳(shell):apps/electron/electron/ 下的 main.js 负责窗口与进程管理。

外壳采用多标签架构:BaseWindow顶部是标签栏,每个标签是一个独立的WebContentsView,各自fork('tab-worker.js')启动一套隔离的代理 + 服务 + PTY。主进程通过探测../server/server.js是否存在来区分「打包布局」与「开发布局」,这让同一份外壳代码在仓库内开发和打包产物里都能正确工作。

一键打包:assemble-app.mjs 如何拼装 stage 目录

在pnpm run electron:build背后,assemble-app.mjs 会先执行 Web 端构建,再从零重建apps/electron/stage暂存目录,共 5 步:

  1. 触发packages/app的 assemble 脚本,把 Web 前端产物复制到位;
  2. 校验server、cli.js、dist等 8 个载荷输入齐全,缺任何一个都会立即报错而不是打出残缺包;
  3. 清空并重建stage,把载荷与electron/外壳并排放入;
  4. 由 stage-manifest.mjs 生成stage/package.json——版本号取自 npm 包,main指向electron/main.js,运行时依赖完整继承自@ccv/electron,并显式拒绝workspace:协议出现在打包产物中;
  5. 把@ccv/core以真实文件形式 vendor 进stage/node_modules(因为0.0.0版本永远无法从注册表解析)。

这一步保证了桌面包与 npm 包版本严格一致,也保证了electron/与server/的相对位置不变——这正是外壳 rootDir 探测所依赖的布局契约。

electron-builder.yml:关键配置一眼看懂

electron-builder.yml 是打包配置的核心,几个值得注意的点:

配置项值作用
directories.appstage打包源是拼装后的暂存目录
directories.outputelectron-dist产物输出到apps/electron/electron-dist/
asarfalse不压缩为 asar,方便直接定位原生模块
npmRebuildtrue自动对node-pty等原生模块做平台重建
mac.targetdmg+zip同时产出安装盘与签名用 zip
hardenedRuntimetrue启用强化运行时(公证的前置条件)
notarizetrue使用内置公证,提交、等待、装订票据一次完成

macOS 部分还声明了 entitlements.mac.plist 权限清单,为 Electron 这类应用开了 JIT、无符号可执行内存、库验证豁免、网络客户端/服务器与用户选定文件读写等开关——每一项在文件注释里都有中文说明,是学习 Electron 权限声明的好范本。

macOS 代码签名:证书与环境变量配置

签名前需要一张Developer ID Application证书,然后通过环境变量交给 electron-builder。项目提供了体检脚本 check-sign-config.sh,会依次检查证书、环境变量与证书文件:

环境变量必需说明
CSC_LINK✅.p12证书文件路径
CSC_KEY_PASSWORD✅.p12证书密码
APPLE_ID公证需要Apple ID 邮箱
APPLE_APP_SPECIFIC_PASSWORD公证需要App 专用密码
APPLE_TEAM_ID公证需要你的 Team ID

运行检查:

pnpm run electron:check-sign

输出会明确告诉你哪些项已就绪、缺什么,避免签名时才发现配置不全。

公证 Notarization:为什么必须「一次到位」

公证(Notarization)是 macOS Gatekeeper 放行未进 Mac App Store 应用的关键环节。CC-Viewer 的做法非常克制:只依赖 electron-builder 的内置公证,配置里仅一行notarize: true,由它在签名后自动检测APPLE_*凭据、提交应用、等待 Apple 审批并装订票据(staple)。

配套的 notarization-config.test.js 用测试锁死了这条纪律:

  • 断言配置中存在notarize: true;
  • 断言不允许出现afterSign钩子;
  • 断言不引入第二套@electron/notarize实现。

这样做的价值在于:重复提交公证会导致 Apple 端报错,而契约测试让「单一公证入口」成为不可被无意破坏的规则。

签名 + 公证由 mac-sign.sh 编排:先校验CSC_LINK/CSC_KEY_PASSWORD是否齐全(缺失立即退出),再检测公证三件套——齐全则签名后自动公证,缺省则降级为「仅签名不公证」并给出明确提示。最后执行:

pnpm run electron:sign # 等价于 build + electron-builder --mac

Windows 与 Linux 产物同样由同一份配置产出:NSIS 安装包(可自选安装目录)与 AppImage。

验证与分发:产物在哪里

构建完成后,所有安装包位于apps/electron/electron-dist/。验证签名是否生效可以用:

codesign -dv --verbose=4 "CC Viewer.app" spctl -a -vvv "CC Viewer.app"

另外值得一提的是仓库自带的 cc-viewer.rb Homebrew 公式:它为 CLI 版安装了一个自定义 shell 包装器,强绑 Homebrew 的 node 而不是 PATH 中的 node——因为node-pty原生绑定跨 Node 大版本会 ABI 失配。这个细节解释了为什么打包时必须开启npmRebuild。

常见问题速查

  • 只想签名不想公证?不设置APPLE_*三个变量即可,脚本会自动降级并提示。
  • 构建报原生模块错误?检查npmRebuild: true是否被改动,并保持 package.json 中electron与electron-builder版本配套。
  • 想本地调试桌面壳?直接pnpm run electron:dev,外壳会自动识别仓库开发布局。

从 Web 到桌面,CC-Viewer 用「拼装暂存目录 + 单一打包配置 + 契约测试」把 Electron 打包、macOS 代码签名与公证收敛成一条可重复、可验证的流水线——这正是开源项目桌面分发值得借鉴的工程实践。

【免费下载链接】cc-viewer

A request monitoring system for Claude Code that captures and visualizes all API requests and responses in real time. Helps developers monitor their Context for reviewing and debugging during Vibe Coding.

项目地址:https://gitcode.com/gh_mirrors/cc/cc-viewer
点击查看免费下载

相关推荐

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

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

GetQzonehistory:免费开源的QQ空间历史说说完整备份工具

GetQzonehistory:免费开源的QQ空间历史说说完整备份工具 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间用了很多年的人,多半都有过这种担心:哪…

作者头像 李华
网站建设 2026/10/16 2:36:51

macOS上搭建STM32开发环境:命令行工具链实战详解

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

作者头像 李华
网站建设 2026/10/16 2:36:48

从零做一只原创软陶玩偶:沙耶的玩偶制作全流程解析

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

作者头像 李华
网站建设 2026/10/16 2:36:25

《派出你的AI同事:WorkBuddy案例实战》072:可复用模板与提示词库

《派出你的AI同事:WorkBuddy案例实战》072:可复用模板与提示词库 📌 卷三 第八部分 案例背后的方法论 附录D 可复用模板与提示词库 附录D引语 可复用模板与提示词库 前面七部分、60+ 案例,每篇结尾都塞了一块"可复用模板"。可真到了你要派活,谁会回去翻 60…

作者头像 李华
网站建设 2026/10/16 2:36:04

连续概率分布

1、连续概率分布的直观理解 连续概率分布是在其定义的区间内可以取任何值。常见的连续概率分布包括正太分布、指数分布、帕累托分布等等。与离散概率分布不同的是,我们是不能随便给连续概率分布的某一个值指定一个概率的。比如掷飞镖我们只会说离靶心10-15cm范围内飞镖的概率而…

作者头像 李华
网站建设 2026/10/16 2:35:53

DLSS Swapper:游戏不更新,一条命令换上新版 DLSS

DLSS Swapper:游戏不更新,一条命令换上新版 DLSS 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 游戏里那版 DLSS 停在老版本,官方更新遥遥无期。DLSS Swapper 是个免费开源的 Windo…

作者头像 李华