只给一个 logo 和名字,就能打包出定制桌面客户端:Qwen Code 品牌构建快速指南
2026/9/20 14:49:08 网站建设 项目流程

只给一个 logo 和名字,就能打包出定制桌面客户端:Qwen Code 品牌构建快速指南

【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code

想象客户想拿到一套贴着自家 Logo 的桌面客户端,却不想自己重写任何界面代码。Qwen Code 的 Tauri 桌面壳(packages/desktop-shell)里内置了一个叫Desktop Brand Builder的品牌构建技能,你只交出一个品牌名和一张 logo,它就能替你产出一套带独立皮肤、独立安装包的白标客户端。这篇带你把这套 Qwen Code 品牌构建流程从零跑通。

它替你做了什么:一次配置,整窗换肤

🔖 你把两样输入交给它之后,真正干活的是技能自带的brand-create.mjs(放在packages/desktop-shell/.agents/skills/desktop-brand-builder/目录下)。这个脚本一口气做完三件你不想手动碰的事:

  • 改写src-tauri/tauri.conf.json,把应用名、Bundle Identifier、描述和更新端点换成品牌值;
  • 用你的 logo 重新生成src-tauri/icons/里那一整套尺寸各异的图标;
  • bootstrap/启动 UI 换品牌名、换 logo,让客户开机第一眼就看到自己的牌子。

先别急着手动去改这三个文件——脚本才是唯一的权威来源,它把配置补丁、图标重建、启动页换肤一次做完,你只负责核对结果。这里藏着一个容易踩的坑:脚本开头会先检查productName是不是还叫Qwen Code Desktop,一旦发现已经被改过就直接报错停下、不写任何文件,因为它是一次性的,同一份克隆里不能跑第二遍。另外它调 Tauri CLI 生成图标时不走 shell、把 logo 路径当普通参数直接传过去,替换品牌名时也会按 JS 和 HTML 两种语境分别转义——配置一不对,脚本会先报错停下,而不是悄悄交付一个坏包。

你只需要准备两样东西,其余它自己推

输入真的很少,通常就这两样(外加一个可选的website):

  • brandId:品牌标识,要满足^[a-z][a-z0-9-]*$,也就是小写字母开头、只能带小写字母数字和短横线;
  • logo:本地图片路径,文件必须真实存在,建议给一张 1024×1024 的方形 PNG。

至于应用名、Bundle Identifier、产物前缀、版权、更新端点,你都不用给,缺什么它就按下面的规则自己推:

  • appName:把brandId按短横线拆开、每段首字母抬高再空格拼接,acme-ai就变成Acme AI
  • artifactPrefix:同样的抬高处理,但用短横线连起来,acme-ai变成Acme-AI
  • appId:若website有合法域名,就把域名标签反过来加.desktophttps://acme.ai推出ai.acme.desktop;推不出来时回落到app.<brandId>.desktop
  • updaterEndpoints:默认就是空数组。

有个贴心细节:aiapicliidesdkuiurl这类缩写词会整体大写,所以acme-cli推出来的显示名是Acme CLI而不是Acme Cli

操作主线:从干净克隆到产出安装包

⚙️ 全程在一个隔离的干净克隆里进行,别污染你手头的仓库。先拉一份只含main的分支:

git clone --branch main --single-branch https://gitcode.com/GitHub_Trending/qw/qwen-code brand-builds/<brandId>-<时间戳>/qwen-code,再git checkout -B brand-<brandId> origin/main。记住:clone 或 checkout 只要失败,就停下来报告,别装作分支建好了继续往下走。

接着在构建目录里写一份临时的brand.json(logo 记得填绝对路径):

{ "brandId": "acme-ai", "logo": "/absolute/path/to/logo.png", "website": "https://acme.ai" }

依赖要装两遍:先npm install装仓库根部的(build:runtime会用到根部的cross-env、esbuild 等工具),再进packages/desktop-shellnpm install --workspaces=false装它自己的。然后直接用纯 Node 启动品牌脚本:

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 报告,把最终appNameappIdartifactPrefix、更新端点,以及被改过的tauri.conf.json、图标结果、bootstrap 文件列表都列给你。核对无误后,进packages/desktop-shell打包:

npm run build:runtime --workspaces=false npx tauri build

产物会落在src-tauri/target/release/bundle/下,按平台分成dmg/nsis/appimage/deb/四个子目录。

跨平台编译与更新源的两条红线

🧩 第一条红线是交叉编译build:runtime会根据QWEN_DESKTOP_TARGET环境变量决定给哪套平台捆绑 Node 运行时,不填就按当前宿主来。当你打包的目标平台跟当前机器不同时,每次执行npx tauri build --target ...之前,都要带着对应的QWEN_DESKTOP_TARGET(比如aarch64-apple-darwin)把build:runtime重跑一遍。漏掉这步,包里塞进去的就是错误架构的 Node 二进制,客户一启动就报 exec format error。要出all的话,就得逐个目标平台重复"重跑 build:runtime → tauri build",而且只有产物文件真的躺在src-tauri/target/<triple>/release/bundle/里,才算数。

第二条红线是更新源隔离:品牌包永远不该去轮询官方 Qwen Code 的更新源,官方源也永远不会来更新你的品牌包,所以updaterEndpoints默认留空。如果品牌方要自建应用内更新,就得自备一套 Tauri 签名密钥对,updaterPubkey必须和签名私钥严丝合缝地对上——端点填了却漏公钥,脚本会当场报错,因为更新器就是拿这把公钥去验每个更新签名的,配不上就等于永远更不了。生成密钥对用npx @tauri-apps/cli signer generate -w ~/.tauri/my-brand.key.key是私钥(设到 CI 的TAURI_SIGNING_PRIVATE_KEY),对应的.pub里那份 base64 公钥贴进brand.json

怎么确认打包成功,出错了又该怎么办

✅ 打包完先做一遍自查:

  • src-tauri/target/release/bundle/(交叉编译则看src-tauri/target/<triple>/release/bundle/)确认dmg/nsis/appimage/deb/下确有文件;
  • 给每个产物算一遍sha256sum(macOS 上用shasum -a 256);
  • 在 macOS 上对生成的 DMG 再跑一次hdiutil verify
  • 最后把产物路径、SHA-256、应用名、appId 和构建目录一起报给用户。

出问题时,按场景对症下药:brandId不合法就把那条正则丢给用户请他改;logo 不存在就补一个合法的本地路径;如果brand-create.mjs压根找不到,就说明脚本缺失,把预期命令原样报出来。最典型的两种"卡死"要特别记牢:构建失败了别删构建目录,留着它加最后几行有用的报错、完整日志路径或失败命令,方便事后排查;配置写错了也别在同一份克隆里重跑脚本——它是一次性的,正确做法是丢掉这份克隆、从新的干净克隆重新开始。

【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询