资讯动态

在 GitHub Actions 中一行打包网页:Pake Composite Action(`tw93/Pake@v3`)全解析

发布时间:2026/9/5 19:10:33 来源:尧图企业网站定制
在 GitHub Actions 中一行打包网页Pake Composite Actiontw93/Pakev3全解析【免费下载链接】Pake Turn any webpage into a desktop app with one command.项目地址: https://gitcode.com/GitHub_Trending/pa/PakePake 是一个基于 Rust Tauri 的命令行工具能把任意网页打包成轻量级桌面应用。除了本地运行 CLI 之外Pake 在仓库根目录内置了一个 Composite Actiondocs/pake-action.md的讲解对象让你的仓库只需添加一个uses: tw93/Pakev3步骤就能在 CI 中自动完成环境搭建、构建并产出可分发的安装包。读完本文你将掌握该 Action 的全部输入/输出参数、各平台产物形态、跨平台矩阵构建写法以及它内部的调用链与安全设计环境变量传参、临时文件、换行注入防护并能将其直接落地到自己的 CI 流程中。快速开始一个步骤即可构建最简单的用法是在 workflow 中添加一个 step- name: Build Pake App uses: tw93/Pakev3 with: url: https://example.com name: MyApp一个完整的最小 workflow 如下官方示例name: Build Web App on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: tw93/Pakev3 with: url: https://weekly.tw93.fun name: WeeklyApp需要注意的一个前提该 Composite Action 的构建脚本依赖工作区里的dist/cli.js与src-tauri模板因此它设计用于在Pake 仓库的 fork或包含 Pake 完整代码的仓库中运行——这正是 内建工作流使用指南 建议Fork 仓库后运行 workflow的原因。如果你的仓库不含 Pake 源码Action 里的npm run cli:build基于 rollup.config.js将无法产出 CLI。输入参数Inputs逐项说明docs/pake-action.md 给出的参数表如下定义源头是 action.yml 第 8–39 行的inputs:段参数说明必填默认值url要打包的目标 URL✅—name应用名称✅—output-dir产物输出目录disticon自定义应用图标URL 或路径未提供时自动抓取站点图标width窗口宽度1200height窗口高度780debug启用调试模式false几个结合实现与 CLI 文档的补充点url/nameurl是必填的打包对象name会原样传给 CLI 的--name。关于应用名在 Windows/macOS 保留空格与大小写、在 Linux 转为小写连字符的规则见 CLI 使用文档。iconAction 只在值非空时才追加--icon参数见下文调用链。留空时 Pake CLI 会自动抓取网站图标并转换为平台对应格式完整行为参考 CLI 文档的 icon 章节。width/height默认值1200/780与 Pake CLI 的默认窗口尺寸一致action.yml 中default: 1200、default: 780与 cli-usage.md 中--width/--height的默认值相互印证。output-dir脚本会先mkdir -p该目录再把构建产物移入action.yml。该参数还会经过换行符校验防止通过注入换行写入额外的GITHUB_OUTPUT键值对详见安全设计一节。debug仅在字符串严格等于true时追加--debug标志。它对应 CLI 的 debug 选项构建调试版并输出更多日志而非浏览器开发者工具开关。输出Outputs输出说明package-path生成安装包的路径在 action.yml 中package-path通过value: ${{ steps.build.outputs.package-path }}从名为build的步骤透出。也就是说后续步骤可以直接消费它- uses: tw93/Pakev3 id: pake - name: Show result run: echo Package is at: ${{ steps.pake.outputs.package-path }}官方示例自定义图标与多平台矩阵构建带自定义图标、指定窗口尺寸- uses: tw93/Pakev3 with: url: https://example.com name: MyApp icon: https://example.com/icon.png width: 1400 height: 900多平台矩阵构建利用 GitHub 的 matrix 策略可以在一次 workflow 中并行构建多个平台jobs: build: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkoutv4 - uses: tw93/Pakev3 with: url: https://example.com name: CrossPlatformApp文档建议的矩阵写法就是哪种 runner 产出哪个平台的包各平台的产物形态如下平台Runner产物Linuxubuntu-latest.deb包macOSmacos-latest.app与.dmg包Windowswindows-latest.exe与.msi包一个值得注意的实现细节Action 在 macOS 上构建时导出了环境变量PAKE_CREATE_APP1action.yml。对照 MacBuilder.ts 的构造逻辑——当process.env.PAKE_CREATE_APP 1时buildFormat被强制设为app而非默认的dmg这解释了为什么 Action 的find查找逻辑会先找文件类安装包、找不到再回退到.app目录在 CI 的无头环境里.appbundle 是默认产物形态。How It WorksAction 内部执行流程docs/pake-action.md 概述了三步流程下面对照 action.yml 的runs:段using: composite两个 composite step逐步展开。第 1 步Setup Environment自动搭建工具链对应 action.yml 的 Setup Environment 步骤shell: bash做了三件事安装 Node.js 依赖直接npm install。按需构建 Pake CLI仅当dist/cli.js不存在时执行npm run cli:build。该脚本定义在 package.json 的scripts段cli:build: cross-env NODE_ENVproduction rollup -c产物即bin声明的 CLI 入口dist/cli.js。按需安装 Rust/Cargo若cargo不在 PATH 中用curl --proto https --tlsv1.2 -sSf下载 rustup 安装脚本并静默执行然后把$HOME/.cargo/bin追加到$GITHUB_PATH供后续步骤使用。这里使用了mktemp生成唯一临时文件存放安装脚本并以trap rm -f $rustup_init EXIT保证退出时清理action.yml——这是对共享 runner 上固定路径如/tmp/rustup-init.sh竞争覆盖问题的修复。第 2 步Build Pake App拼装并执行 CLI 命令对应 action.yml 的 Build Pake App 步骤id: build。输入通过环境变量传递而非行内插值。该步骤先声明env:块把 7 个 input 映射为INPUT_*环境变量action.ymlenv: INPUT_URL: ${{ inputs.url }} INPUT_NAME: ${{ inputs.name }} INPUT_ICON: ${{ inputs.icon }} INPUT_WIDTH: ${{ inputs.width }} INPUT_HEIGHT: ${{ inputs.height }} INPUT_DEBUG: ${{ inputs.debug }} INPUT_OUTPUT_DIR: ${{ inputs.output-dir }}这个设计有明确的测试保障tests/unit/action-input-security.test.ts 会读取action.yml源码并断言——run:脚本中不得出现${{ inputs.* }}行内表达式正则/\$\{\{\s*inputs\./必须不匹配且上述 7 条env映射必须逐一存在。其含义是用户输入永远不会被拼进 shell 命令文本而是作为环境变量由 shell 在运行时读取从结构上杜绝了输入内容改写脚本的可能性。参数拼装逻辑action.yml先校验INPUT_OUTPUT_DIR不含换行符\n/\r违规直接报错退出ARGS($INPUT_URL)以 URL 位置参数开头随后追加--name $INPUT_NAMEicon仅在非空时追加--icon--width、--height始终追加未传时为 action 默认值debug仅在等于true时追加--debugmkdir -p输出目录并export PAKE_CREATE_APP1最后以printf %q打印完整命令便于在 CI 日志中复核再执行node dist/cli.js ${ARGS[]}。也就是说Action 并没有绕过 Pake CLI而是把它完整包了一层CLI 内部由 BuilderProvider.ts 按当前 OS 分发到 LinuxBuilder.ts、MacBuilder.ts 或 WinBuilder.ts真正执行 Tauri 构建。第 3 步Package Output查找并搬运产物构建完成后脚本在src-tauri/target下查找产物action.yml先find文件类安装包*.deb、*.exe、*.msi、*.dmg取第一个命中head -1若未找到回退查找 macOS 的.app目录呼应上面PAKE_CREATE_APP1的产物形态差异找到后mv到$INPUT_OUTPUT_DIR/basename移动失败则退回cp -r写入前再次校验PACKAGE_PATH无换行符防止污染GITHUB_OUTPUT成功则printf package-path%s\n $PACKAGE_PATH $GITHUB_OUTPUT并打印确认找不到任何产物则打印 No package found 并以退出码 1 失败。以上三条输出相关的断言id: build、GITHUB_OUTPUT写入格式、output 值映射同样被 action-input-security.test.ts 固化属于文档承诺即代码契约的验证方式。安全设计为什么输入处理要这么讲究docs/pake-action.md 没有专门展开安全部分但 action.yml 的实现里体现了几处对 CI 注入场景的防御值得了解表达式与脚本分离run:脚本中不出现任何${{ inputs.* }}所有输入经env:传递见上文测试用例逐条断言该约束换行注入防护GITHUB_OUTPUT采用keyvalue逐行追加格式若output-dir或最终包路径中含换行符攻击者可以追加任意键例如覆盖steps.*.outputs或触发后续步骤执行。脚本在写入前对两处路径做了$\n/$\r检查并直接失败退出action.yml 与 action.yml临时文件唯一化rustup 安装脚本经mktemp生成、trap清理不再使用固定的/tmp/rustup-init.sh测试显式断言源码中不再包含该路径命令打印与执行分离printf %q让日志中的命令与实际执行内容一一对应便于审计参数是否被意外篡改。与仓库内建 Workflow 的关系Pake 项目自身维护了两套基于 GitHub Actions 的构建方式不要混淆本文的主角——Composite Actionaction.yml供你自己的项目通过uses: tw93/Pakev3引用的通用打包步骤参数即上文 Inputs 表。项目内建 workflow位于 .github/workflows/single-app.yaml 的 Build Single Popular App支持workflow_dispatch表单触发参数更丰富new_window、incognito、--targets deb,appimage、macOS--targets universal --multi-arch、签名与公证 secrets 等使用actions/upload-artifact上传产物、打 tag 时推送到 Release。其使用方式见 GitHub Actions Usage。两者底层调用的是同一个 CLInode dist/cli.js差异只在于 workflow 层能传--targets等 Action 未暴露的 CLI 选项。更多 CLI 选项请参考 CLI Usage 与 Advanced Usage均有中文版本cli-usage_CN.md、advanced-usage_CN.md。小结用法在fork 的Pake 仓库 workflow 里加一步uses: tw93/Pakev3必填urlname可选icon、width默认 1200、height默认 780、output-dir默认dist、debug输出package-path供后续步骤使用。原理composite action 自动完成npm install→ 按需cli:build→ 按需装 Rust → 环境变量传参调用node dist/cli.js→ 在src-tauri/target中定位.deb/.exe/.msi/.dmg/.app并搬运到输出目录。平台Ubuntu runner 出.debmacOS runner 出.app/.dmgCI 中默认.app形态Windows runner 出.exe/.msi矩阵策略可并行多平台。可验证依据参数定义见 action.yml安全约束见 tests/unit/action-input-security.test.tsmacOS 产物形态见 bin/builders/MacBuilder.ts文档主体见 docs/pake-action.md。【免费下载链接】Pake Turn any webpage into a desktop app with one command.项目地址: https://gitcode.com/GitHub_Trending/pa/Pake创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价