
如何生成定制品牌桌面客户端Qwen Code Tauri 白标 Desktop Brand Builder 完整指南【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code客户丢给你一句“做个我们自己的白标桌面客户端明天要”你手里只需要两样东西一个brandId和一张 logo。Qwen Code 的Desktop Brand Builder就能从 Tauri 桌面壳一键产出定制品牌客户端与 DMG/EXE/AppImage/deb 白标安装包全程不追问、不确认快速交付。品牌化只动三个地方tauri.conf.json、icons/ 与 bootstrap/先搞清楚白标品牌化到底改什么。Qwen Code 的桌面实现早先基于 Electronpackages/desktop目录如今那套已被移除Tauri 壳是唯一的桌面实现品牌化挂载点也只剩三处都在 packages/desktop-shell 里src-tauri/tauri.conf.json应用名、bundle identifier、打包与更新配置src-tauri/icons/全套应用图标bootstrap/启动 UI应用冷启动时展示的品牌文案与 Logo。整个 Desktop Brand Builder 技能就是围着这三个挂载点设计的一份最小brand.json加一个零依赖脚本把三处的 Qwen 字样、图标和标识全部换成你的品牌。最小输入只有两项brandId 加一张 logo其余全靠推导打开技能定义 SKILL.md 你会发现输入规则刻意压到最少。通常你只需要{ brandId: acme-ai, logo: /absolute/path/to/logo.png, website: https://acme.ai }website可省。技能明确要求不要向用户追问 app name、app id、产物名、版权或更新端点——除非用户主动要覆盖。必填项缺失时只问一次齐全之后直接进构建不设确认步骤。两条硬性校验brandId必须匹配^[a-z][a-z0-9-]*$小写字母开头只允许小写字母、数字、短横线logo必须是本地真实存在的文件推荐 ≥1024px 的方形 PNG。可覆盖的可选字段还有appName、appId、artifactPrefix、updaterEndpoints、updaterPubkey、targetmac/win/linux/all。剩下的字段全部确定性推导脚本自己就能补齐appName把brandId按短横线拆段各段首字母大写后空格连接acme-ai→Acme AIartifactPrefix同样首字母大写但用短横线连接acme-ai→Acme-AIappId若website有合法 host先剥掉www.前缀再把 host 各段反转并追加.desktophttps://acme.ai→ai.acme.desktophost 不足两段时落入回退回退appIdapp.brandId.desktop例如app.acme-ai.desktopupdaterEndpoints默认空数组。还有一个细节源码里维护了一组缩写词ai、api、cli、ide、sdk、ui、url派生名称时它们整体大写——acme-cli得到的是Acme CLI而不是Acme Cli。这里埋着品牌化最重要的一条安全底线品牌包永远不轮询官方更新源官方源也永远不更新品牌包。所以端点默认留空只有品牌方给了自己的更新源才填。三个补丁加三道保险brand-create.mjs 的壳改造逻辑真正干活的只有 brand-create.mjs 这一个脚本Node ≥ 18、零依赖。它按顺序执行三段补丁每段都配了防御。补丁一改 tauri.conf.json。四个字段被替换productName→ 品牌应用名identifier→ 品牌appIdbundle.shortDescription→ 「${appName} desktop shell for the Qwen Code Web Shell」plugins.updater.endpoints→ 品牌端点。注意一个容易炸的细节清空端点时脚本会同时把bundle.createUpdaterArtifacts置为false免得 bundler 继续生成没人消费的签名更新产物并把 updater 公钥清空为空字符串而不是删除字段——tauri-plugin-updater的 schema 声明pubkey: String且没有 serde 默认值字段真被删了应用启动时反序列化直接失败而端点为空时空字符串的公钥完全无害。补丁二重做全套图标。调用tauri-apps/cli icon从你的 logo 重新生成整包图标。脚本不走命令解释器它用require.resolve(tauri-apps/cli/tauri.js)直接定位 CLI 入口再用spawnSync(process.execPath, [...])启动logo 路径以纯 argv 元素传递——哪怕文件名里藏着$(cmd)或反引号也无从触发 shell 注入。CLI 跑挂时只有一级回退logo 是 PNG 就把它复制成src-tauri/icons/icon.png并告警“其余尺寸还是旧 logo”logo 不是 PNG 则一个图标都不动提示你先转 PNG 再试。补丁三换 bootstrap 启动 UI。品牌 logo 被复制为bootstrap/brand-logoext然后替换 bootstrap/index.html 与bootstrap/bootstrap.js里的title、h1、启动文案中的Qwen Code字面量以及qwen-code-logo.svg的引用。两种语境分开转义JS 文件里是单引号字符串字面量脚本先用JSON.stringify处理反斜杠、换行等控制字符剥掉外层双引号后再转义单引号——只转单引号是不够的像Bobs App\这种以反斜杠结尾的名字会把结束引号一起“吃掉”HTML 文件则按→→→→的顺序做实体转义先转是为了避免引入的实体被二次转义。所有替换都用函数式 replacer防止$之类的模式被意外展开成匹配文本。三道保险一次性锁脚本先检查productName是否还叫默认值Qwen Code Desktop。已经不是说明这棵树被品牌化过——bootstrap 补丁依赖原始字面量pubkey/endpoints 的改动也无法回滚脚本直接拒绝运行。断路器你提供了更新端点或公钥但目标tauri.conf.json里没有plugins.updater段fork 或手改过的壳脚本在写任何文件之前就报错。否则更新配置会被悄悄丢弃最后交付一个永远无法自更新的“成功”品牌包。同名拒绝appName恰好等于Qwen Code Desktop时在加载期直接拒绝——否则单次使用守卫永远不触发第二次运行会在 bootstrap 文件里把品牌字符串重复拼接。从源码到安装包运行流程以及那个必踩的交叉编译坑第一步全新克隆隔离开工。品牌构建在独立目录里做工作仓库保持干净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-code git checkout -B brand-brandId origin/main约定很硬clone 或 checkout 失败就停在这里报失败绝不允许假装brand-brandId已存在继续往下走。第二步两处依赖都装上。品牌脚本本身只依赖 desktop-shell 的node_modules但后面的npm run build:runtime会回调仓库根部的cross-env、esbuild 等 devDependencies所以根部与子包都要装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 报告brandId、appName、appId、artifactPrefix、updaterEndpoints、被补丁的tauriConfig路径、图标生成结果与bootstrapPatched文件列表留档即可。第四步打包。默认打宿主平台cd packages/desktop-shell npm run build:runtime --workspacesfalse npx tauri build交叉编译是最大的坑。build:runtime由 scripts/prepare-runtime.js 实现它按QWEN_DESKTOP_TARGET默认宿主平台下载对应架构的 Node 运行时捆绑进runtime/qwen-code/而这个目录会被 Tauri 打进安装包。目标平台和宿主不一致时每跑一次tauri build --target之前都必须带着环境变量重跑一遍build:runtimeQWEN_DESKTOP_TARGETaarch64-apple-darwin npm run build:runtime --workspacesfalse npx tauri build --target aarch64-apple-darwin漏掉这一步产物里内嵌的就是宿主架构的 Node 二进制用户一启动就是exec format error。该环境变量会被归一化为五种合法目标darwin-arm64、darwin-x64、linux-arm64、linux-x64、win32-x64传了不支持的值直接抛错。target: all就逐个目标循环走“build:runtime→tauri build”只跑当前机器或 CI 支持的目标——文件真实存在才允许声称产出了对应平台的安装包。产物位置宿主目标在packages/desktop-shell/src-tauri/target/release/bundle/指定 triple 时在src-tauri/target/triple/release/bundle/下面按平台分dmg/macOS、nsis/Windows、appimage/和deb/Linux。想让品牌客户端自更新密钥和更新源必须是你自己的品牌构建默认不签名。上游发布流水线的 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缺失直接报错。原因写在源码注释里——更新器用这把公钥校验每一个更新的签名拿官方公钥配自定义源或干脆没公钥每次更新检查都会验签失败应用永远更新不了。再叠加上面说过的那条双向隔离品牌包不轮询官方源官方源也不碰品牌包。交付怎么验收翻车了怎么办打包完成后按顺序过一遍确认产物在src-tauri/target/release/bundle/交叉编译是src-tauri/target/triple/release/bundle/的dmg/、nsis/、appimage/、deb/对应子目录里对每个产物算 SHA-256sha256summacOS 上shasum -a 256macOS 生成的 DMG 再跑一次hdiutil verify把产物路径、SHA-256、应用名、appId 和构建目录一并报给客户。失败场景基本都在这几类brandId不合法把正则^[a-z][a-z0-9-]*$摆出来请用户改logo 路径无效请一个真实存在的本地文件brand-create.mjs缺失报告脚本路径与预期命令shell-root 已被品牌化productName不再是默认值回到全新克隆重来构建挂掉保留现场、返回最后几行有用错误和完整日志路径。两条铁律值得贴在屏幕边上失败时不许删构建目录——它是留给事后排查的现场不是给你删掉重试的绝不在同一个克隆重跑brand-create——脚本是一次性的品牌配置写错了丢弃克隆、从头再来。把这套 Desktop Brand Builder 串起来看白标交付其实被压缩成了一条命令链一份brand.json、一个零依赖 Node 脚本、三段补丁、三道保险再按目标走build:runtime与tauri build。从客户丢来 brandId 和 logo到你交回带 SHA-256 清单的白标安装包中间每一步都确定性、可重复、可验收。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考