十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一个 brandId 加一张 logo,如何白标出 Qwen Code 的 Tauri 桌面客户端:品牌构建完整实战

一个 brandId 加一张 logo,如何白标出 Qwen Code 的 Tauri 桌面客户端:品牌构建完整实战 一个 brandId 加一张 logo如何白标出 Qwen Code 的 Tauri 桌面客户端品牌构建完整实战【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-codeQwen Code 的 Tauri 桌面壳内置了一套白标、品牌构建能力你给出一个 brandId 和一张本地 logo它就能产出一个带着你的应用名、你图标、你安装器文件名的桌面客户端以及 DMG/EXE/AppImage/deb 安装包。配置文件不用你碰图标不用你手工处理。需求通常是这样进来的甲方要一个带自家 logo 与应用名的桌面客户端能安装、能分发。仓库里的 packages/desktop-shell/ 就是现在唯一的桌面实现Electron 旧版早已移除品牌挂载点集中在三处tauri.conf.json应用名、Bundle Identifier、打包与更新配置、src-tauri/icons/图标全家桶、bootstrap/ 启动 UI。下面的流程全部围绕这三处展开驱动它们的是一份技能文档SKILL.md加一个零依赖的 Node 脚本。01 开工准备三条命令克隆出专属构建环境为什么要为品牌单独克隆一份brand-create.mjs 会在壳里原地改文件而且补丁不可逆——bootstrap 的替换依赖原始字面量改了就没法回滚。所以规矩很简单每个品牌一个全新克隆你的工作仓库保持原样。BUILD_ROOT$PWD/brand-builds/acme-ai-20260919 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-acme-ai origin/main⚠️踩坑提示clone 或 checkout 任何一步失败就地停手并报告失败不要装作brand-acme-ai分支已经建好而继续往下走。写 brand.json只需要两样东西在构建目录里放一份临时brand.jsonlogo 用绝对路径{ brandId: acme-ai, logo: /absolute/path/to/logo.png, website: https://acme.ai }brandId必须匹配^[a-z][a-z0-9-]*$小写字母、数字、短横线且以字母开头logo是真实存在的本地文件路径推荐 ≥ 1024px 的方形 PNGwebsite可选。缺必填项时只向用户询问一次、把缺什么列清楚不反复追问。必填项一集齐就进入构建没有确认环节。你不填它会怎么算出来没填的字段全部按确定性规则补齐而不是回头找你要答案appNamebrandId 按短横线切段每段首字母大写空格连接。acme-ai→Acme AIartifactPrefix同样的首字母大写但用短横线连接。acme-ai→Acme-AIappIdwebsite 含合法 host 时先剥掉开头的www.再把 host 各标签反转、追加.desktop。https://acme.ai→ai.acme.desktophost 不足两段时落回app.brandId.desktop如app.acme-ai.desktopupdaterEndpoints默认空数组即不开应用内更新为什么是默认关的见 04。源码里还维护了一份缩写词名单ai、api、cli、ide、sdk、ui、url派生名称时整体大写。所以brandId: acme-cli得到的是Acme CLI不是Acme Cli。想覆盖派生值直接在 brand.json 里加字段appName、appId、artifactPrefix、updaterEndpoints、updaterPubkey、targetmac / win / linux / all。02 一条命令跑通脚本替你干完的三件事装依赖两份 node_modules一个原因品牌脚本本身零依赖Node ≥ 18 就能跑。但后续build:runtime会调用仓库根部的cross-env、esbuild 等 devDependencies所以打包前要装两处# 根部依赖build:runtime 需要 cross-env、esbuild 等 npm install # desktop-shell 自身依赖 cd packages/desktop-shell npm install --workspacesfalse cd ../..跑脚本等三步走完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只要这个内置脚本可用就别去手改tauri.conf.json、图标或 bootstrap 字符串——脚本才是补丁配置与生成资源的唯一权威来源。目标壳如果已被品牌化脚本会直接拒跑单次使用的设计细节放在 05 的踩坑速查。跑完输出一份 JSON 报告brandId、appName、appId、artifactPrefix、updaterEndpoints、被补丁的 tauriConfig 路径、图标结果icons、被补丁的 bootstrap 文件列表bootstrapPatched过一眼即可。第一步改配置四个字段外加一个空字符串脚本对 tauri.conf.json 改四处productName换成品牌名identifier换成 appIdbundle.shortDescription换成应用名 desktop shell for the Qwen Code Web Shellplugins.updater.endpoints换成品牌的端点。端点为空时脚本还会顺手做两件事把bundle.createUpdaterArtifacts置为false让打包器别再产出没人消费的签名更新产物把官方plugins.updater.pubkey置为空字符串。⚠️踩坑提示这里是“置为空字符串”不是“删掉字段”。tauri-plugin-updater 的 schema 声明pubkey: String且没有 serde 默认值直接删字段会让应用在启动时反序列化失败。端点同时为空时空字符串无害——根本不会有任何更新检查运行。第二步重建图标logo 路径不经过 shell全套图标由 Tauri 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并告警其余尺寸仍是 Qwen Code 旧 logo事后可用npx --yes tauri-apps/cli icon logo手动补全logo 非 PNG一个图标都不替换提示先把 logo 转成 PNG 再重试。第三步换启动皮肤两种语境两套转义logo 被复制进 bootstrap 目录、命名为brand-logoext随后index.html与bootstrap.js被补丁title、h1以及启动文案里的Qwen Code字面量全部换成品牌名qwen-code-logo.svg引用换成品牌 logo 文件名。麻烦在字符串安全两种语境两套打法JS 语境bootstrap.js里是单引号字面量。先JSON.stringify转义反斜杠、换行等控制字符剥掉外层双引号再转义单引号。只转单引号不够——名字以反斜杠结尾时比如Bobs App\会“逃逸”掉字符串的结束引号HTML 语境index.html里是文本内容和双引号属性。按→→→→的顺序做实体转义排最前避免后面替换引入的实体被二次转义替换一律用函数式 replacer防止$模式被展开$会被解释成匹配文本搞坏内容。03 产出安装包交叉编译唯一守则是重跑 build:runtime宿主打包两条命令cd packages/desktop-shell npm run build:runtime --workspacesfalse npx tauri build # 当前平台交叉编译先带环境变量跑 runtime再 buildbuild:runtime由 prepare-runtime.js 实现它按QWEN_DESKTOP_TARGET环境变量默认宿主平台下载并捆绑对应平台的 Node.js 运行时到runtime/qwen-code/。该变量会被归一化成五种受支持目标darwin-arm64、darwin-x64、linux-arm64、linux-x64、win32-x64不支持的 triple 直接抛错。⚠️踩坑提示目标平台与宿主不同时每次tauri build --target之前都必须带着QWEN_DESKTOP_TARGET重跑一遍build:runtime。否则打包产物内嵌的是错误架构的 Node 二进制应用一启动就是 exec format error。# 交叉编译每个 target 前先带环境变量重跑 build:runtime QWEN_DESKTOP_TARGETaarch64-apple-darwin npm run build:runtime --workspacesfalse npx tauri build --target aarch64-apple-darwin # macOS arm64target: all就按目标逐个走build:runtime→tauri build而且只跑当前机器或 CI 支持的那些 target。产物落在哪里宿主目标packages/desktop-shell/src-tauri/target/release/bundle/指定 triplesrc-tauri/target/triple/release/bundle/。bundle 子目录按平台分dmg/macOS、nsis/Windows、appimage/与deb/Linux和 tauri.conf.json 里声明的 targets 一一对应。文件真实存在于这些目录你才能对用户说“跨平台产物已产出”——嘴上声称不算数。04 自建更新签名密钥对和更新源都得是自己的品牌构建默认不签名这是设计上游发布流水线的 Apple、Windows 签名密钥与更新私钥只属于官方 Qwen Code 发布。品牌方要签名发布或应用内更新就自备独立凭据和独立更新源绝不复用上游的。由此推出品牌化最重要的一条隔离品牌构建包永远不轮询官方 Qwen Code 更新源官方更新源也永远不更新品牌构建包。所以updaterEndpoints默认是空数组只有品牌方真的提供了自己的更新源才把端点填进去。生成你自己的更新密钥对npx tauri-apps/cli signer generate -w ~/.tauri/my-brand.key.key文件是私钥在你的构建 CI 里设为TAURI_SIGNING_PRIVATE_KEY配套的.pub文件是 base64 公钥粘贴进 brand.json 的updaterPubkey。⚠️踩坑提示updaterEndpoints非空时updaterPubkey必填且必须和签名用的TAURI_SIGNING_PRIVATE_KEY配对。更新器拿这把公钥校验每个更新的签名——拿官方公钥配自建源、或者干脆缺公钥每次更新检查都会校验失败应用就永远更不了。脚本在 loadConfig 阶段直接报错不让这种配置通过。失败关闭没有 updater 段就拒绝写入如果品牌提供了 updater 配置端点非空或带了公钥而目标 tauri.conf.json 里没有plugins.updater段fork 或手工改过的 shell-root 上会发生脚本会在写入任何文件之前直接报错。放它通过的话校验过的更新配置会被悄悄丢弃最终交付一个永远无法更新的品牌构建——报错了反而省事。05 验收与踩坑速查怎么验怎么落地打包后的四步验收确认产物在src-tauri/target/release/bundle/交叉编译为src-tauri/target/triple/release/bundle/落在dmg/、nsis/、appimage/或deb/之一每个产物算哈希Linux 用sha256summacOS 用shasum -a 256macOS 上对生成的 DMG 跑一遍hdiutil verify向用户报告产物路径、SHA-256、应用名、appId、构建目录。踩坑速查六类报错六种落地撞上了什么怎么落地构建失败保留构建目录供事后排查返回最后几条有用的错误行附上完整日志路径或产生失败的命令想在同一克隆重跑 brand-create拒跑productName已不是Qwen Code Desktop即判定已品牌化。配置有误就丢弃这个克隆重新克隆重来appName 恰好等于 Qwen Code Desktop加载期直接拒绝。单次使用守卫靠productName偏离默认值来工作名字撞了默认值守卫就哑了第二次运行会在 bootstrap 文件里把品牌字符串重复拼接brandId 不合法把正则^[a-z][a-z0-9-]*$亮出来请用户修正logo 缺失或不是本地文件请用户给出一个真实存在的本地路径brand-create.mjs 不在报告packages/desktop-shell/.agents/skills/desktop-brand-builder/scripts/brand-create.mjs缺失并附上预期命令⚠️踩坑提示失败时不删构建目录。它是留给事后排查用的不是用来重试品牌步骤的。整条链路其实就是一条命令链写一份 brand.json跑一次 brand-create.mjs然后按 target 循环build:runtime→tauri build。从品牌输入到可安装产物中间没有一个需要手工碰文件的环节。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表