@ taffleoff/ desktop- shell (简体中文)
共享 Electron 运行时间和在每个 Burdenoff 桌面应用程序后面构建工具
shell——托盘,本地菜单,窗口状态,通知,徽章,主题同步,
自动更新 UX 和深层链接在一个软件包中,加 burdenoff-desktop 国 际
阶段、发射、烟雾测试和核验.
在此包裹之前, ~40 个应用弹壳中每个都携带自己的 30 kB
electron/main.cjs本身 scripts/prepare-electron.mjs,以及它自己的副本
(单位:千美元) "build" 块中 package.json他们漂了,漂了.
此修正的两个错误
1. 包装的应用程序未发运 node_modules。 。 。 .
directories.app 指针 electron/build/app,一个舞台脚本文件夹
装入了网页和两个 .cjs 文档 - 其它没有。 内部
包裹的灰烬, require('electron-updater') 财务报告和审定财务报表
require('@capgo/electron-updater') 因此,在启动时就抛出。 两者都是
包起来 try/catch,所以每个释放的安装器看起来健康,同时
自动更新和CapGo OTA无声地死去。 。 。 .
burdenoff-desktop stage 现在 捆绑 electron/main.cjs 与
bun build --target=node --format=cjs --external electron内衬
@burdenoff/desktop-shell 财务报告和审定财务报表 electron-updater,然后声明输出
包含没有纯更新导入。 CapGo 已经嵌入到已发布中
桌面 shell 捆绑一个拒绝并联的流取器,路径
越狱和超规模的档案。 一个仍然需要的舞台应用 node_modules
失败 .
2. 沙盒预装不能 require 队长Go.
仅解决预装的沙盒 electron 和几块活字 任意 npm
require 预装是困难的失败,所以制造桥从不
出现。 预装货是用同样的方式捆绑的,并且针对一个明确的
允许列表( e)electron, (中文(简体) ), events, (中文(简体) ), timers, (中文(简体) ), url) (中文(简体) ).
两种说法都存在 stage,在这个repo's scripts/verify-bundle.ts,以及
作为发布工作流程中的"short splated bund"步骤.
第三只更安静的虫子:40发炮弹中有38发 默认电子图标, (中文(简体) ),
因为旧舞台剧本已经复制 build/icon.png 只有发生
已存在. stage 现在明确解决图标 失败 当没有
平方 PNG 至少为 512px.
安装到 shell 中
四个包装文件,一个配置切片,一个包. json delta:
electron/main.cjs require('@burdenoff/desktop-shell/main').createDesktopApp(require('./desktop.config.cjs'));
electron/preload.cjs require('@burdenoff/desktop-shell/preload').installPreload(require('./desktop.config.cjs'));
electron/desktop.config.cjs module.exports = require('../native.config.json').desktop ?? require('../native.config.json');
electron-builder.config.cjs module.exports = require('@burdenoff/desktop-shell/builder').createElectronBuilderConfig(require('./electron/desktop.config.cjs'));
{
"main": "electron/main.cjs",
"dependencies": { "@burdenoff/desktop-shell": "<CalVer>" },
"devDependencies": {
"electron": "^43.4.1",
"electron-builder": "^26.0.12",
"playwright-core": "^1.50.0" // drives `burdenoff-desktop smoke`
}
}
从外壳中移除: "build" 键, electron-updater, (中文(简体) ),
@capgo/electron-updater, (中文(简体) ), @capacitor-community/electron, (中文(简体) ),
scripts/prepare-electron.mjs, (中文(简体) ), scripts/electron-launch.mjs, (中文(简体) ),
scripts/electron-before-build.cjs, (中文(简体) ), src/electronRuntime.ts。 。 。 .
分类脚本、模板和每个 {{TOKEN}} 发电机
替代品 : templates/README.md。 。 。 .
校验 bunx burdenoff-desktop doctor - 它必须离开0.
渲染器表面
制造器被视为不可信:它运行共享的MFE捆绑,在 生产,任何网络捆绑 CAPGO OTA 活动。 它所能达到的:
| 全球 | 目录 |
|---|---|
window.__burdenoffDesktop | 桌面桥(BurdenoffDesktopBridge 内 src/shared/types.ts(中文(简体) ) |
window.<product>Electron | 遗留子集; legacyGlobal: false 移除它 |
window.electronUpdater | notifyAppReady() 仅限 |
每个 ipcMain 输入点检查调用框架是否在应用程序源头上
(或dev服务器)在演艺前. OTA 捆绑选择——下载,激活,
重置、频道和端点变化——只在主要过程中发生
CapGo软件包自有的渲染器API和IPC处理器没有被安装. 这个
渲染器的单个OTA输入是应用准备的信号,两者都
__burdenoffDesktop.notifyAppReady() 财务报告和审定财务报表 electronUpdater.notifyAppReady()
发送 IPC.appReady,而主要进程向 CapGo 推进
运行的捆绑是保存而不是回滚.
桌面焦点模式( E)focusMode: true(中文(简体) )
有重点会议(TimeCampus)的产品可以打开
window.__burdenoffDesktop.focus。显示器,它持有用户的
届会、电话 focus.setState({ active, sessionId, endsAt, strict, blockedApps, doNotDisturb, trackAppSwitches }) 每隔几秒钟
会话运行;然后主进程:
- 打开操作系统不扰动模式,然后恢复,除非它
是那个打开的 macOS 没有公共焦点 API, 因此运行
两个用户创建的快捷键("焦点打开"/"焦点关闭"); 2;
GNOME 应用
gsettings(单位:千美元)show-banners); Windows 没有支持的 API,所以 状态为unsupported附有说明; - 样本前景应用程序(macOS)
osascript+ 系统事件,需要 自动化权限; Windows PowerShell + user32; Linux X11xdotool, (中文(简体) ), Wayland 不支持). 切换到被屏蔽的应用程序会被严格隐藏 课程或对标准课程的警告,并通过focus.onBlockedApp; 与trackAppSwitches每一个完成的前景 长度报告通过focus.onAppSegment· ; - 如果渲染器停止刷新5个, 将再次关闭所有设备 几分钟后,一个坠毁或被记录下来的 渲染器从不离开 应用程序隐藏或 通知已变音.
focus.getStatus() 编号 : focus.onStatus() 报告实际效果
机器(on, (中文(简体) ), needs-setup, (中文(简体) ), unsupported, (中文(简体) ), error与人可读
detail。所有帮助者都会通过 execFile 带有参数数组和 a
超时; 没有渲染器字符串到达外壳或脚本正文 .
桌面闲置检测( E)idleDetection: true(中文(简体) )
自动捕获(TimeCampus)的产品可打开
window.__burdenoffDesktop.idle。渲染器调用
idle.configure({ enabled, thresholdSeconds }) 使用用户的设置
(阈值被夹到 60.3600秒);然后是主要过程
powerMonitor.getSystemIdleTime() (门槛的每个季度,最多
每15秒)并收听屏幕锁定,解锁,暂停并恢复.
每个完成的拉伸 人离开他们的最后键盘或
鼠标输入其之后的第一个输入(或解锁/恢复),是
通过报告 idle.onIdlePeriod({ startedAt, endedAt, reason }) 与
reason inactive, (中文(简体) ), locked 或者说 suspended。伸展比
阈值从未报告, 关闭检测会打开
伸缩. idle.getStatus() 编号 : idle.onStatus() 报告该人是否
现在,以及这个操作系统是否能够报告输入不活动
(单位:千美元)supported) (中文(简体) ). 显示器只读取上次输入后的秒; 它
永远也看不到哪个键被按住或者指针去了哪里.
内容安全政策
每个 HTML 文档 <scheme>://app 协议服务(内置捆绑,
a OTA捆绑,和SPA倒置) 包含两种政策,由
src/main/csp.ts 从运行时间配置 :
| 页眉 | 政策 |
|---|---|
Content-Security-Policy | object-src 'none'; base-uri 'none'; frame-ancestors 'self' |
Content-Security-Policy-Report-Only | 全面目标政策: 'self',网关来源(https + wss),SSO来源,以及第三方共享的 MFE 负载(Stripe.js, Razorpay Checkout; 软件包-CDN样式表和字体). 图像和媒体可能来自任何 https 主机 |
仅报告违规情况不会封锁任何东西;主要进程记录每个
独立([burdenoff-desktop:<product>:csp]),所以包件构建没有
DevTools还给他们看。 目标中故意不包含软件包 CDN
script-src:从中装入的脚本被报告,应当与
应用程序之前 script-src 进入强制政策. frame-ancestors
实值 'self'没有 'none',因此应用程序仍然可以设定自己的文档
smoke 命令检查信头和一个同源的iframe.
CLI 参考
burdenoff-desktop <command> [options]
-h, --help this help (or `<command> --help`)
-v, --version package version
stage
构建 electron/build/app ——文件夹电子-构建器包. 替换
scripts/prepare-electron.mjs。 。 。 .
| 选项 | 默认 | 含义 |
|---|---|---|
--root <dir> | 数据 | 贝壳根 |
--env <name> | $BURDENOFF_DESKTOP_ENV | local | alpha | prod (单位:千美元)staging编号 :production 已接受) |
--web-dist <dir> | dist | 要复制的网页构建 |
--deps-mode <mode> | bundle | bundle 内入每个依赖; install 写入 dependencies 进入舞台 package.json 运行 bun install --production --ignore-scripts 里面(有记录的倒地,为真正无法分解的本地模块) |
--launch | 关 | 运行 launch 后来 |
它: 读取配置 解析图标( 如果缺少则失败) 擦去
electron/build/app * 复制网页内容 * 捆绑 main.cjs + 键 preload.cjs
写道: electron/runtime-config.json (单位:千美元)
无依赖性 package.json + 阶段图标+应享待遇 + 在macOS上
重命名 dev 副本 Electron.app (PlistBuddy + 临时代号) 所以码头
图标和菜单标题是产品的.
launch
burdenoff-desktop launch [--root <dir>] [--env <name>] [-- <electron args>]
将本地的Electron在舞台应用上相接而来
每个 BURDENOFF_DESKTOP_* 变量( 遗留 <PREFIX>_ELECTRON_* 值为
常态化为克能克名先行). 在macOS上,它更喜欢重命名
electron/build/<ProductName>.app替换 scripts/electron-launch.mjs。 。 。 .
命令行没有通过运行时配置参数 :
RUNTIME_ARG_PREFIX是主 + 预装通道( URI- encoded JSON byadditionalArguments, (中文(简体) ), 与cfAccess(被剥去). 主读舞台runtime-config.json本身, 财务报告和审定财务报表BURDENOFF_DESKTOP_*超过它.
smoke
burdenoff-desktop smoke [--root <dir>] [--packaged <dir>] [--timeout <ms>] [--screenshot <path>] [--no-tray] [--allow-missing-driver]
推出相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相接相接相接相接相接相接相接相接相接相接相相接相接相相相相相相相接相相.
electron/dist/linux-unpacked)通过 playwright-core电子驱动器
BURDENOFF_DESKTOP_SMOKE=1 并声称:
| 检查 | 请求 |
|---|---|
window | 第一个窗口打开 |
title | 等于 productName |
bridge | window.__burdenoffDesktop.product.id 等于 product |
diagnostics | globalThis.__burdenoffDesktopDiagnostics 已发布 |
protocol | protocolRegistered |
menu | menu |
tray | tray (轻轻地) --no-tray ——无头 CI 没有托盘主机) |
deep-link | app.emit('open-url', …, '<scheme>://app/smoke') 到达渲染器 |
updater-surface | window.electronUpdater 曝光情况 notifyAppReady 没有别的了 |
csp | 应用文档带有强制基线和只报告的政策(退出应用协议) |
csp-frame | 应用程序文档的同源 iframe 还装入 |
updater 编号 : capgo 编号 : webRoot | 未报告 |
写作 electron/dist/smoke/window.png 并打印表格;以非零键退出
关于失败的可读报告。 运行在下面 xvfb-run 在 Linux 上。 无
playwright-core 其出口为 1 或 0 --allow-missing-driver。 。 。 .
icons
burdenoff-desktop icons [--root <dir>] [--check]
物质 electron/build/icons/ (电子建筑师 buildResources:
icon.png 从 iconSource → public/icons/icon-512x512.png →
public/icons/icon-512.png → electron/icon.png → build/icon.png附加时
entitlements.mac.plist 从这个包裹. --check 只有报告.
电子建设器 .icns编号 :.ico 从PNG,所以没有图像库
参与.
doctor
burdenoff-desktop doctor [--root <dir>] [--json]
只读验证外壳——配置有效性(每个问题都报告,而不是)
只是第一个,薄薄的包装, electron-builder.config.cjs,可解的图标,
需要/禁止依赖性、教条脚本、遗留文件
删除 "build" 键。 打印表格; --json 发射
{ root, product, ok, checks: [{ id, status, summary, problems }] } 联 合 国
舰队核查员。 1号出口,任何故障.
预期的软件包. json delta 是从这个软件包读取的
templates/package-scripts.json,所以迁移模板和验证人
永远无法漂移.
配置合同
src/shared/types.ts 是权威的。 外壳的桌面切片
native.config.json数字 :
{
"desktop": {
"product": "vibecontrols", // slug: Linux executableName, staged package name
"productName": "VibeControls", // window title, tray, installer, artifact names
"appId": "com.vibecontrols.www", // NEVER rewrite — updater identity + Windows AUMID
"capgoAppId": "com.vibecontrols.desktop", // omit to disable CapGo OTA
"scheme": "vibecontrols", // deep links + Linux MimeType
"domain": "vibecontrols.com", // app origins + update feeds
"devServerPort": 5200,
"envPrefix": "VIBE", // legacy VIBE_ELECTRON_* fallback ("VIBE_ELECTRON" also accepted)
"appOrigins": { "prod": "https://admin.burdenoff.com" }, // optional override
"category": { "mac": "public.app-category.developer-tools", "linux": "Development" },
"links": { "docs": "…", "support": "…", "status": "…" },
"window": { "width": 1440, "height": 900, "minWidth": 960, "minHeight": 600 },
"closeToTray": { "win32": true, "linux": false },
"iconSource": "public/icons/icon-512x512.png",
"maintainer": "Name <email>",
"legacyGlobal": true,
"focusMode": false, // true exposes __burdenoffDesktop.focus (see below)
"idleDetection": false // true exposes __burdenoffDesktop.idle (see below)
}
}
electron/desktop.config.cjs 还被接受为来源并优先.
环境
每个变量都是 BURDENOFF_DESKTOP_<KEY>背负遗产
<envPrefix>_ELECTRON_<KEY> 所以没有移动的贝壳和工作流程继续工作:
| 变量 | 效果 |
|---|---|
ENV | local | alpha | prod |
VERSION | 卡尔维尔烤入舞台 package.json |
START_URL | dev- server 来源于窗口负载 |
UPDATE_FEED_URL | 覆盖生成的电子更新种子 |
GLOBAL_BASE_URL 编号 : WORKSPACE_BASE_URL 编号 : PUBLIC_STORE_BASE_URL | 网关覆盖 |
CF_ACCESS_CLIENT_ID 编号 : CF_ACCESS_CLIENT_SECRET | 只有α ——被烤入电子更新器可以到达Access-gated alpha下载主机 |
DEVTOOLS | 启动时打开桌面 |
默认来源 domain: prod 种子 https://<domain>/downloads/latest, (中文(简体) ),
阿尔法种子 https://alphadownloads.<domain>/downloads/latest,应用程序来源
https://app.<domain> 编号 : https://alphaapp.<domain>。 。 。 .
CF 访问证书被烤入 仅构建α 拥有一个α 二进制意味着加入团队. 他们从来没有被写成一个专业或本地 建立,而CLI在每一个日志行中都进行编辑.
电子建构器配置
createElectronBuilderConfig(config, overrides?) 获得整个
配置 。 和旧的手工复制品一样 "build" 块
(附录+deb x64, 通用 dmg + zip, NSIS x64, asar,, ),
${productName}-${version}-${arch}.${ext}),随舰队修正:
directories.buildResources实值electron/build/icons, (中文(简体) ), 没有build/—— 说 多个贝壳生成build/i18n-bundle.json那边;- 链接
.desktop获得MimeType=x-scheme-handler/<scheme>;- 没有它深 链接在 Linux 上保持沉默; npmRebuild: false替换旧的beforeBuild: () => false黑客攻击;- 硬化运行时间,
gatekeeperAssess: false权利,以及notarize: false——公证是明示的xcrun notarytoolCI步骤如此 苹果的证书上永远没有障碍; - 没有
publish键:发布工作流程同步到S3本身.
appId 通过逐字记录。 贝壳不同(com.burdenoff.<p> 对
com.<p>.www)并重写每个安装的用户的应用程序数据和
打破更新器.
释放流量
bun run electron:build:<env> → burdenoff-desktop stage - 主张已定
捆 * electron-builder --config electron-builder.config.cjs 签了字
s3 云纹无效.
templates/workflows/release-electron.yml 是峡谷管道
(单位:千美元)workflow_dispatch 与 platforms编号 :channel编号 :version编号 :dry_run编号 :mark_latest:
(单位:千美元) validate-inputs 任务/ 其它工作取决于( CalVer) version时,已知
选择值,无秘密),a capgo-ota 工作(仅生产
electron-production从完整性锁定的CLI
.github/tools/capgo-cli, (中文(简体) ), linux 编号 : macos (单位:千美元)macos-15) (中文(简体) ) windows 构建
任务,以及 a publish 任务上传 downloads/<ver>/<os>/,镜像
downloads/latest/<os>/ 带有稳定的未变相别名
自动更新器种子( e)latest-mac.yml, (中文(简体) ), latest.yml, (中文(简体) ), latest-linux.yml 加减
安装器,它们的名字) downloads/latest/ 其中电子更新器
generic 提供者寻找, 写入
manifest.json (建造与 jq)并作废云花. macOS 标志
CSC_LINK 和通过公证工具进行公证/安装; Windows 标志
azure/artifact-signing-action (v2.0.0) 接着 重新计算
latest.yml 长沙512/大小,因为签名会在二进制后重写
电子建构器将其散开,电子更新器将拒绝
下载。 安装为 --frozen-lockfile第三方行动以SHA为支柱,
而发送输入仅通过 env: 看到了吗
templates/README.md。 。 。 .
templates/workflows/native-smoke.yml 是 ~6分钟的路径过滤式 PR 守护 :
安装 / 医生 / 建造 / 阶段 / electron-builder --dir --linux →
xvfb-run burdenoff-desktop smoke --packaged ——截图文物.
移徙清单
- 添加数据
desktop切为native.config.json。 。 。 . - 邮票
electron/main.cjs, (中文(简体) ),electron/preload.cjs, (中文(简体) ),electron/desktop.config.cjs, (中文(简体) ),electron-builder.config.cjs。 。 。 . - 应用
templates/package-scripts.json(合并数)scripts/deps, 应用remove) (中文(简体) ). - 删除
scripts/prepare-electron.mjs, (中文(简体) ),scripts/electron-launch.mjs, (中文(简体) ),scripts/electron-before-build.cjs, (中文(简体) ),src/electronRuntime.ts,则"build"键. - 确保 PNG 的正方形存在 :
public/icons/icon-512x512.png) (中文(简体) ). - 印出两个工作流程.
bun install && bunx burdenoff-desktop doctor- 必须离开0.bun run electron:run:local——窗口,托盘,菜单,深链接.bunx burdenoff-desktop smoke(编)--no-tray在无头的Linux.- 释放干运行 :
Release Electron与dry_run=true。 。 。 .
开发此软件包
bun install
bun run sanity # lint + format + type:check + test + build
bun run build # dist/{main,preload,builder,config,cli}.cjs + d.ts
bun run scripts/verify-bundle.ts
test/fixture-shell/ 是用于 .github/workflows/smoke.yml
锻炼 doctor, (中文(简体) ), icons, (中文(简体) ), stage 财务报告和审定财务报表 smoke 结束而不依赖
在产品回收.
许可证:专有——包德诺夫咨询服务有限公司.