Pake 使用教程:把任意网站打包成桌面应用

整理 tw93/Pake 的安装、命令行打包、自定义图标和窗口尺寸、本地开发与构建命令,适合把常用网站封装成轻量桌面应用。

Pake 使用 Tauri 把远程网页、本地 HTML 文件或静态站点目录封装成 macOS、Windows 和 Linux 桌面应用。真正的使用难点不是记住一条 pake URL,而是确认 Node、Rust 和平台构建依赖齐全,并验证登录、跳转、下载、摄像头等网站能力在系统 WebView 中是否仍然可用。

项目地址:

https://github.com/tw93/Pake

快速结论

  • 推荐使用 Node.js 22,最低要求为 18;CLI 构建还需要 Rust 1.85+。
  • 第一次构建会下载和编译依赖,明显慢于后续构建,不能把等待误判成卡死。
  • 自动化或 Agent 调用应加入 --json,不要靠匹配自然语言日志判断成功。
  • Pake 不能绕过网站对嵌入式 WebView、第三方 Cookie、SSO 或浏览器扩展的限制。

检查环境并安装 Pake CLI

先检查版本:

1
2
3
4
node --version
npm --version
rustc --version
cargo --version

Node 低于 18 或 Rust 低于 1.85 时,先升级环境。推荐安装命令:

README 给出的命令:

1
pnpm install -g pake-cli

也可以直接用 npm:

1
npm install -g pake-cli

安装后必须验证当前终端找到的是预期版本:

1
2
pake --version
pake --help

全局安装遇到权限问题时,可先用 npx pake-cli [url] [options],不要直接使用管理员权限覆盖系统 Node 目录。

第一次打包使用公开简单页面

把 GitHub 打包成桌面应用:

1
pake https://github.com --name "GitHub"

Pake 默认把产物写到当前目录。第一次运行可能安装 Rust 或平台组件;命令结束后检查退出码和实际安装包,而不是只看日志里出现 success

自动化环境建议使用结构化输出:

1
pake https://github.com --name "GitHub" --json

标准输出应是一份可解析的 JSON。非零退出、JSON 解析失败或 JSON 中没有产物路径,都应视为构建失败。

自定义图标、窗口与目标平台

README 里给了更完整的示例:

1
pake https://weekly.tw93.fun --name Weekly --icon https://cdn.tw93.fun/pake/weekly.icns --width 1200 --height 800 --hide-title-bar

需要注意平台差异:

  1. --hide-title-bar 只适用于 macOS。
  2. Windows/Linux 隐藏系统装饰应使用 --hide-window-decorations
  3. --targets 用于选择 DMG、AppImage、DEB、RPM 或目标架构,具体可用值依赖当前系统。
  4. 图标可以是本地或远程文件,Pake 会转换为平台格式;下载失败时应改用本地文件排除网络问题。

例如在 macOS 只生成便于测试的 .app

1
PAKE_CREATE_APP=1 pake https://example.com --name "Example"

Linux 打包 AppImage:

1
pake https://example.com --name "Example" --targets appimage

不要在一台系统上假设可以无配置地生成所有平台安装包。跨架构构建还需要对应 Rust target 和系统工具链。

打包本地静态站点

Pake 可以直接接收包含 index.html 的构建目录:

1
2
npm run build
pake ./dist --name "MyTool" --json

目录输入会打包完整文件树。单个 HTML 文件若需要一并复制旁边资源,应按官方说明使用 --use-local-file

1
pake ./my-app/index.html --name "MyApp" --use-local-file

本地 SPA 的 Hash 路由可直接工作;History 模式路由并不等同于普通 Web 服务器,深层路径刷新前必须实测。

用配置文件固定可重复构建

参数较多时,使用 JSON 配置比不断复制长命令更容易审计:

1
pake --config app.json --json

app.json 纳入版本控制,但不要写入网站登录 Cookie、Token 或内部临时地址。构建记录至少保留 Pake 版本、Node 版本、Rust 版本、目标平台和产物校验值。

验证桌面应用而不是只验证安装包

安装或打开构建产物后,按网站真实用途逐项检查:

  1. 首屏能加载,证书和代理没有报错。
  2. 登录完成后重启应用,确认会话是否按预期保留。
  3. 外部链接是在应用内还是系统浏览器打开,行为符合安全边界。
  4. 文件上传、下载、剪贴板和拖放能否工作。
  5. 快捷键、窗口缩放和系统托盘没有与网页自身冲突。

如果是视频会议站点,macOS 还要显式声明权限:

1
pake https://meet.example.com --name "Meet" --camera --microphone

这些参数不能保证网站一定允许 WebView 登录或调用设备,只是为应用添加相应权限声明。

登录、SSO 和跳转失败怎么查

先用调试模式重建:

1
pake https://app.example.com --name "ExampleDebug" --debug

打开开发者工具查看 Console 和 Network。常见边界包括:

  • 身份提供商拒绝嵌入式 WebView。
  • 第三方 Cookie 或跨域存储被限制。
  • OAuth 回调跳到另一个域名,被默认交给系统浏览器。
  • 网站依赖浏览器扩展或多标签页。

需要保留可信 SSO 域名时,可以评估 --safe-domain

1
pake https://app.example.com --name "Example" --safe-domain app.example.com,login.example.com

不要使用过宽的域名规则把所有链接强制留在应用内。SSO 服务明确拒绝 WebView 时,继续扩大导航范围也无法修复。

构建失败的判断顺序

阶段 典型现象 处理方式
CLI 未找到 pake: command not found 检查 npm/pnpm 全局 bin 是否进入 PATH,或用 npx pake-cli
Rust 初始化失败 找不到 rustc、下载超时 单独安装 Rust,重新打开终端后验证版本
平台依赖缺失 Tauri bundler、WebKitGTK 或打包器报错 安装当前系统所需依赖,不要反复重装 pake-cli
图标处理失败 下载失败、格式转换失败 改用本地 PNG/ICO/ICNS,再单独验证网络
网站白屏 构建成功但运行时无内容 --debug 检查 CSP、证书、JS 和 WebView 兼容性
登录循环 登录成功后又回到入口 检查 Cookie、回调域名和身份提供商 WebView 政策

如何恢复到最小可用构建

排错时先保留失败命令和版本输出,然后回到最简单的公开 URL:

1
2
3
4
pake --version
node --version
rustc --version
pake https://example.com --name "PakeSmokeTest" --json

如果最小样本成功,说明工具链基本正常,问题更可能在目标网站、图标或额外参数。随后每次只加一个选项。若最小样本也失败,再处理 Node、Rust 或平台依赖。

升级 CLI 后出现回归时,不要覆盖旧产物。记录当前版本并在隔离目录重建同一个 smoke test;只有新旧版本差异可重复出现时,才判断为 CLI 回归。

本地开发

如果你想改 Pake 本身:

1
pnpm i

本地开发:

1
pnpm run dev

构建应用:

1
pnpm run build

开发 Pake 本身与使用 CLI 不是同一条路径。官方当前推荐 Node.js 22,并要求 Rust 1.85+。普通用户只为封装网页时,不需要克隆仓库执行这组三条命令。

发布前验收

发布给其他人之前,应在干净账号或测试机器完成以下检查:

  1. --json 返回成功且产物路径真实存在。
  2. 安装、启动、退出和卸载均正常。
  3. 登录、回调、上传下载与外链行为符合预期。
  4. 没有把内部 Token、Cookie 或调试入口打进应用。
  5. 记录 Pake、Node、Rust 版本以及目标架构。
  6. 保留上一份可工作的安装包,以便新版网站或 CLI 发生回归时恢复。

Pake 很适合文档站、监控面板和固定使用的 Web 工具,但不等于完整浏览器。先用 --debug 和最小 smoke test 证明目标网站适合 WebView,再做图标、托盘、窗口和权限定制,才能避免“安装包生成成功、应用却不能用”的假完成。