Qwen Code Tauri 白标桌面端:3 字段完成换肤 Qwen Code Tauri 白标桌面端3 字段完成换肤【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code本文走一遍 Qwen Code Tauri 桌面壳desktop-shell的白标品牌构建流程一个brandId加一张 logo内置的brand-create.mjs脚本即可完成配置、图标、启动屏替换产出白标桌面端安装包并拆解交叉编译与更新签名两个最容易翻车的环节。 我们要替换的到底是什么这一节先划定工作量边界所谓“品牌化”到底动了仓库里的哪些东西。假设需求是我们自己的产品需要一个带独立名称和图标的桌面客户端UI 底座用 Qwen Code 的 Web Shell。现在 Qwen Code 的桌面实现统一收敛在 packages/desktop-shell 这个 Tauri 壳里更早的 Electron 实现已经移除而品牌化的挂载点只有三处tauri.conf.json应用名、Bundle Identifier、描述、更新源端点src-tauri/icons/各尺寸、各格式的应用图标全家桶bootstrap/ 启动 UI应用冷启动时用户第一眼看到的标题、文案与 Logo。这个壳本身很薄frontendDist直接指向../bootstrap真正的 Web Shell 跑在随包捆绑的 Node 运行时里。所以品牌面很小真正值得做的是把这块小面板变成可重复、可校验的脚本化流程——这正是仓库里desktop-brand-builder技能在做的事Agent 按 SKILL.md 的流程用一个零依赖的 Node 脚本 brand-create.mjs 完成全部替换全程不手工改配置。 备什么最小输入清单这一节回答“用户该填什么、脚本该自己推什么”。设计目标是让用户最多填三个字段其余全部走确定性推导而不是追问。输入字段速查如下字段必填校验 / 含义brandId是必须匹配^[a-z][a-z0-9-]*$小写字母开头只含小写字母、数字、短横线logo是必须存在的本地文件路径推荐方形 PNG尺寸 ≥ 1024pxwebsite否官网地址用于推导appIdappName/appId/artifactPrefix否分别覆盖派生的显示名、Bundle Identifier、安装包文件名前缀updaterEndpoints否更新源端点 JSON 数组空数组表示禁用应用内更新updaterPubkey条件必填base64 公钥updaterEndpoints非空时必须提供且要与签名产物所用私钥配对target否mac/win/linux/all必填项缺失时只问一次不反复追问填齐后直接进入构建没有确认环节。派生规则由 brand-create.mjs 实现appName按短横线拆词、逐词首字母大写、空格连接acme-ai→Acme AIartifactPrefix同样拆词但用短横线连接acme-ai→Acme-AIappIdwebsite有合法 host先剥掉www.前缀、要求至少两段时反转 host 标签再追加.desktophttps://acme.ai→ai.acme.desktop回退appIdapp.brandId.desktopupdaterEndpoints默认空数组。一个容易被忽略的细节源码内置了缩写词集合ai、api、cli、ide、sdk、ui、url派生名称时这些词整体大写所以acme-cli得到的是Acme CLI而不是Acme Cli。输入就绪后在构建目录写一份brand.jsonlogo 用绝对路径{ brandId: acme-ai, logo: /absolute/path/to/logo.png, website: https://acme.ai }appName、appId这些字段都可以不写脚本会派生只有确实要自建更新源时才加updater*字段。⚙️ 跑什么从隔离克隆到三步补丁这一节走完整命令链并拆开脚本内部的三个补丁及其防御设计。先在隔离克隆里干活。品牌补丁直接写进源码树工作仓库必须保持干净所以每个品牌用一个全新克隆BUILD_ROOT$PWD/brand-builds/brandId-timestamp mkdir -p $BUILD_ROOT git clone --branch main --single-branch \ https://gitcode.com/GitHub_Trending/qw/qwen-code \ $BUILD_ROOT/qwen-code cd $BUILD_ROOT/qwen-codeclone 一旦失败就停下来报告不能假装流程已经推进。装依赖。品牌脚本本身只要求 Node ≥ 18但打包阶段的build:runtime会调用仓库根的工具链cross-env、esbuild 等 devDependencies所以根部与 desktop-shell 两套依赖都要装npm install cd packages/desktop-shell npm install --workspacesfalse cd ../..运行品牌脚本。原则是内置脚本可用时禁止手工编辑tauri.conf.json、图标文件或 bootstrap 品牌字符串脚本是补丁与资源生成的唯一权威来源。node packages/desktop-shell/.agents/skills/desktop-brand-builder/scripts/brand-create.mjs \ --shell-root /absolute/path/to/qwen-code/packages/desktop-shell \ --config /absolute/path/to/brand.json结束后脚本打印一份 JSON 报告派生出的appName/appId/artifactPrefix、被补丁的配置路径、图标生成结果、bootstrap 补丁文件清单后续验证全靠它。脚本内部的三个补丁打补丁tauri.conf.json写入productName、identifier、bundle.shortDescription、plugins.updater.endpoints。这里有一条最重要的安全约束——品牌构建永远不许轮询官方更新源官方更新源也永远不许更新品牌构建。因此updaterEndpoints默认为空清空端点时脚本还会连带做两件事把bundle.createUpdaterArtifacts置为false别再生成没人消费的签名更新产物并把官方pubkey置为空字符串而不是删掉字段——插件 schema 声明pubkey: String且没有 serde 默认值删字段会导致启动时反序列化失败而端点为空时空字符串无害。重新生成图标全家桶调用 Tauri CLI 的icon子命令把 logo 展开成全部尺寸。值得注意的调用方式脚本先require.resolve出 CLI 入口再用spawnSync(process.execPath, [...])启动让 logo 路径作为普通 argv 元素传递、不经过任何命令解释器——文件名里就算带$(...)或反引号也注入不了。CLI 不可用时走两级回退logo 是 PNG 就只复制成icons/icon.png并警告其余尺寸仍是旧 logo非 PNG 则不碰任何图标提示先转 PNG 再重跑npx --yes tauri-apps/cli icon logo。打补丁启动屏把 logo 复制为bootstrap/brand-logoext替换 index.html 与 bootstrap.js 里的启动文案和旧 Logo 文件名。替换做了双语境转义JS 侧是单引号字符串先用JSON.stringify转义反斜杠、换行等控制字符再处理单引号只转单引号不够——名字以反斜杠结尾会“逃逸”掉结束引号HTML 侧按→→→→顺序做实体转义先转是为了不让后续引入的实体被二次转义替换全部使用函数式 replacer避免$这类模式展开把内容改坏。还有两条护栏要记牢单次使用守卫运行前检查productName是否仍是默认值Qwen Code Desktop若已变更直接拒绝——bootstrap 补丁依赖原始字面量补丁不可逆同一克隆不许重跑失败关闭品牌提供了更新配置端点非空或带了 pubkey但目标配置里没有plugins.updater段时脚本在写任何文件之前报错。否则会悄悄丢掉已校验的更新配置交付一个永远无法更新的品牌构建。同理配置加载阶段若发现appName恰好等于Qwen Code Desktop也会直接拒绝——否则单次使用守卫失效第二次运行会把品牌字符串重复拼进 bootstrap 文件。️ 看什么交叉编译为什么必须重跑运行时这一节讲打包阶段最容易翻车的一步。宿主平台打包是两行命令cd packages/desktop-shell npm run build:runtime --workspacesfalse npx tauri build坑在交叉编译。build:runtime对应 prepare-runtime.js它按QWEN_DESKTOP_TARGET环境变量默认宿主平台下载对应平台的 Node 运行时并捆绑到runtime/qwen-code/。源码会把变量归一化到五个受支持目标darwin-arm64、darwin-x64、linux-arm64、linux-x64、win32-x64不在列表内的值直接抛错。原因在于目标与宿主不一致却不重跑build:runtime打出来的包里捆绑的就是宿主架构的 Node 二进制应用一启动就是 exec format error。所以每切换一次--target都必须带环境变量重跑一遍QWEN_DESKTOP_TARGETaarch64-apple-darwin npm run build:runtime --workspacesfalse npx tauri build --target aarch64-apple-darwintarget: all就是按目标逐个循环“build:runtime → tauri build”而且只跑当前机器或 CI 真正支持的目标——文件没落盘之前不要声称产出了跨平台产物。产物位置宿主目标packages/desktop-shell/src-tauri/target/release/bundle/指定 triplesrc-tauri/target/triple/release/bundle/bundle 下的子目录与 tauri.conf.json 声明的打包目标一一对应dmg/、nsis/、appimage/、deb/。 更新公钥怎么配对这一节只在品牌方要自建更新源时才需要读。默认状态已经是安全的端点为空应用不做任何更新检查。品牌构建默认不签名官方发布流水线的 Apple / Windows 签名密钥与更新私钥只服务于官方 Qwen Code——品牌方需要签名发布或应用内更新时必须自备独立凭据和独立更新源绝不复用上游密钥。自建更新源的第一步是生成密钥对npx tauri-apps/cli signer generate -w ~/.tauri/my-brand.key.key是私钥在构建 CI 里设为TAURI_SIGNING_PRIVATE_KEY配套的.pub是 base64 公钥写进brand.json的updaterPubkey。脚本在配置加载阶段强制校验updaterEndpoints非空而updaterPubkey缺失直接报错。理由很直接——更新器用这把公钥校验每次更新的签名若拿官方公钥配自建源或干脆没有公钥所有更新检查都会校验失败应用永远无法更新。这属于“填错了不报错、只静默失效”的字段必须在入口拦住。 验什么现场怎么留这一节给打包后的验证清单和失败场景速查。打包后验证四步确认产物落在对应平台的bundle/目录dmg/、nsis/、appimage/或deb/交叉编译走triple路径对每个产物算哈希sha256summacOS 用shasum -a 256macOS 下对 DMG 追加hdiutil verify向用户报告产物路径、SHA-256、应用名、appId、构建目录。失败场景速查场景处理brandId非法展示正则^[a-z][a-z0-9-]*$请用户修正logo 路径无效请提供存在的本地文件路径内置脚本缺失报告brand-create.mjs不存在并给出预期命令shell-root 已品牌化脚本拒绝运行必须从全新克隆开始构建失败保留构建目录取最后有用的错误行与日志路径两条铁律失败时不删构建目录——它是事后排查的现场不是“清空重试”的对象绝不在同一克隆里重跑brand-create——脚本是单次使用的品牌配置错了就丢弃克隆从头再来。快速回看最小输入brandId logo 路径外加可选website其余字段由脚本确定性派生最易翻车的一步交叉编译——每次tauri build --target前必须带QWEN_DESKTOP_TARGET重跑build:runtime否则产物内嵌错误架构的 Node产物去哪找src-tauri/target[/triple]/release/bundle/下的dmg//nsis//appimage//deb/报告时附哈希失败留什么构建目录 最后错误行重跑时丢弃克隆绝不在同一棵树上二次打补丁。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考