From 9deb2744a9e45affa723061fa85b598eff310d6b Mon Sep 17 00:00:00 2001 From: landaiqing Date: Sat, 8 Nov 2025 16:24:02 +0800 Subject: [PATCH] :rocket: Update build and release workflows --- .github/workflows/build-release.yml | 119 +++++++---- build/COMMANDS.md | 293 ++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+), 40 deletions(-) create mode 100644 build/COMMANDS.md diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 2444d40..671dc86 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -50,19 +50,19 @@ jobs: MATRIX='{"include":[]}' if [[ "$PLATFORMS" == *"windows"* ]]; then - MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"windows-latest","os":"windows","arch":"amd64","output_name":"voidraft-windows-amd64.exe","id":"windows"}]') + MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"windows-latest","os":"windows","arch":"amd64","platform_dir":"windows","id":"windows"}]') fi if [[ "$PLATFORMS" == *"linux"* ]]; then - MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"ubuntu-22.04","os":"linux","arch":"amd64","output_name":"voidraft-linux-amd64","id":"linux"}]') + MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"ubuntu-22.04","os":"linux","arch":"amd64","platform_dir":"linux","id":"linux"}]') fi if [[ "$PLATFORMS" == *"macos-intel"* ]]; then - MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"macos-latest","os":"darwin","arch":"amd64","output_name":"voidraft-darwin-amd64","id":"macos-intel"}]') + MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"macos-latest","os":"darwin","arch":"amd64","platform_dir":"darwin","id":"macos-intel"}]') fi if [[ "$PLATFORMS" == *"macos-arm"* ]]; then - MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"macos-latest","os":"darwin","arch":"arm64","output_name":"voidraft-darwin-arm64","id":"macos-arm"}]') + MATRIX=$(echo "$MATRIX" | jq -c '.include += [{"platform":"macos-latest","os":"darwin","arch":"arm64","platform_dir":"darwin","id":"macos-arm"}]') fi # 使用 -c 确保输出紧凑的单行 JSON,符合 GitHub Actions 输出格式 @@ -116,17 +116,41 @@ jobs: if: matrix.os == 'linux' run: | sudo apt-get update + # Wails 3 + 项目特定依赖 sudo apt-get install -y \ build-essential \ + pkg-config \ libgtk-3-dev \ - libwebkit2gtk-4.0-dev \ - pkg-config + libwebkit2gtk-4.1-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf \ + libx11-dev \ + rpm \ + fuse \ + file + + # 依赖说明: + # - build-essential: C/C++ 编译工具链 + # - pkg-config: 包配置工具 + # - libgtk-3-dev: GTK3 GUI 框架 + # - libwebkit2gtk-4.1-dev: WebKit2GTK 4.1 (Wails 3 要求) + # - libayatana-appindicator3-dev: 系统托盘支持 + # - librsvg2-dev: SVG 图标支持 + # - patchelf: 修改 ELF 二进制文件 + # - libx11-dev: X11 库 (热键服务依赖) + # - rpm: RPM 打包工具 + # - fuse: AppImage 运行依赖 + # - file: 文件类型检测工具 - # Windows 平台依赖(GitHub Actions 的 Windows runner 已包含 MinGW) + # Windows 平台依赖 - name: 设置 Windows 构建环境 if: matrix.os == 'windows' run: | - echo "Windows runner 已包含构建工具" + # 安装 NSIS (用于创建安装程序) + choco install nsis -y + # 将 NSIS 添加到 PATH + echo "C:\Program Files (x86)\NSIS" >> $GITHUB_PATH shell: bash # macOS 平台依赖 @@ -150,52 +174,67 @@ jobs: working-directory: frontend run: npm run build - # 构建 Wails 应用 - - name: 构建 Wails 应用 + # 使用 Wails Task 构建和打包应用 + - name: 构建和打包 Wails 应用 run: | - wails3 build -platform ${{ matrix.os }}/${{ matrix.arch }} + # 使用 wails3 task 执行平台特定的打包任务 + cd build/${{ matrix.platform_dir }} + wails3 task package PRODUCTION=true ARCH=${{ matrix.arch }} + env: + CGO_ENABLED: 1 + APP_NAME: voidraft + BIN_DIR: ../../bin + ROOT_DIR: ../.. shell: bash - # 查找构建产物 - - name: 查找构建产物 - id: find_binary - shell: bash + # 整理构建产物 + - name: 整理构建产物 + id: organize_artifacts run: | + echo "=== 构建产物列表 ===" + ls -lhR bin/ || echo "bin 目录不存在" + + # 创建输出目录 + mkdir -p artifacts + + # 根据平台复制产物 if [ "${{ matrix.os }}" = "windows" ]; then - BINARY=$(find build/bin -name "*.exe" -type f | head -n 1) + echo "Windows 平台:查找 NSIS 安装程序" + find . -name "*.exe" -type f + cp bin/*.exe artifacts/ 2>/dev/null || echo "未找到 .exe 文件" + + elif [ "${{ matrix.os }}" = "linux" ]; then + echo "Linux 平台:查找 AppImage, deb, rpm, archlinux 包" + find bin -type f + cp bin/*.AppImage artifacts/ 2>/dev/null || echo "未找到 AppImage" + cp bin/*.deb artifacts/ 2>/dev/null || echo "未找到 deb" + cp bin/*.rpm artifacts/ 2>/dev/null || echo "未找到 rpm" + cp bin/*.pkg.tar.zst artifacts/ 2>/dev/null || echo "未找到 archlinux 包" + elif [ "${{ matrix.os }}" = "darwin" ]; then - # macOS 可能生成 .app 包或二进制文件 - BINARY=$(find build/bin -type f \( -name "*.app" -o ! -name ".*" \) | head -n 1) - else - BINARY=$(find build/bin -type f ! -name ".*" | head -n 1) - fi - echo "binary_path=$BINARY" >> $GITHUB_OUTPUT - echo "找到的二进制文件: $BINARY" - - # 重命名构建产物 - - name: 重命名构建产物 - shell: bash - run: | - BINARY_PATH="${{ steps.find_binary.outputs.binary_path }}" - if [ -n "$BINARY_PATH" ]; then - # 对于 macOS .app 包,打包为 zip - if [[ "$BINARY_PATH" == *.app ]]; then - cd "$(dirname "$BINARY_PATH")" - zip -r "${{ matrix.output_name }}.zip" "$(basename "$BINARY_PATH")" - echo "ARTIFACT_PATH=$(pwd)/${{ matrix.output_name }}.zip" >> $GITHUB_ENV + echo "macOS 平台:查找 .app bundle" + find bin -name "*.app" -type d + # macOS: .app bundle,打包成 zip + if [ -d "bin/voidraft.app" ]; then + cd bin + zip -r ../artifacts/voidraft-darwin-${{ matrix.arch }}.app.zip voidraft.app + cd .. else - cp "$BINARY_PATH" "${{ matrix.output_name }}" - echo "ARTIFACT_PATH=$(pwd)/${{ matrix.output_name }}" >> $GITHUB_ENV + echo "未找到 .app bundle" fi fi + + echo "=== 最终产物 ===" + ls -lh artifacts/ || echo "artifacts 目录为空" + shell: bash # 上传构建产物到 Artifacts - name: 上传构建产物 uses: actions/upload-artifact@v4 with: - name: ${{ matrix.output_name }} - path: ${{ env.ARTIFACT_PATH }} - if-no-files-found: error + name: voidraft-${{ matrix.id }} + path: artifacts/* + if-no-files-found: warn # 创建 GitHub Release 并上传所有构建产物 release: diff --git a/build/COMMANDS.md b/build/COMMANDS.md new file mode 100644 index 0000000..c1ea3fd --- /dev/null +++ b/build/COMMANDS.md @@ -0,0 +1,293 @@ +# Wails 3 命令参考表 + +本文档列出了 Voidraft 项目中使用的所有 Wails 3 命令和参数。 + +## 📋 命令总览 + +| 类别 | 命令 | 用途 | +|------|------|------| +| 生成工具 | `wails3 generate` | 生成项目所需的各种资源文件 | +| 打包工具 | `wails3 tool package` | 使用 nfpm 打包应用程序 | +| 任务执行 | `wails3 task` | 执行 Taskfile.yml 中定义的任务 | + +--- + +## 🔧 详细命令参数 + +### 1. `wails3 generate bindings` +**生成 TypeScript 绑定文件** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-f` | 构建标志 | `''` (空字符串) | +| `-clean` | 清理旧绑定 | `true` | +| `-ts` | 生成 TypeScript | 无需值 | + +**使用位置:** `build/Taskfile.yml:53` + +**完整命令:** +```bash +wails3 generate bindings -f '' -clean=true -ts +``` + +--- + +### 2. `wails3 generate icons` +**从单个图片生成多平台图标** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-input` | 输入图片路径 | `appicon.png` | +| `-macfilename` | macOS 图标输出路径 | `darwin/icons.icns` | +| `-windowsfilename` | Windows 图标输出路径 | `windows/icons.ico` | + +**使用位置:** `build/Taskfile.yml:64` + +**完整命令:** +```bash +wails3 generate icons \ + -input appicon.png \ + -macfilename darwin/icons.icns \ + -windowsfilename windows/icons.ico +``` + +--- + +### 3. `wails3 generate syso` +**生成 Windows .syso 资源文件** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-arch` | 目标架构 | `amd64` / `arm64` | +| `-icon` | 图标文件 | `windows/icon.ico` | +| `-manifest` | 清单文件 | `windows/wails.exe.manifest` | +| `-info` | 应用信息 JSON | `windows/info.json` | +| `-out` | 输出文件路径 | `../wails_windows_amd64.syso` | + +**使用位置:** `build/windows/Taskfile.yml:42` + +**完整命令:** +```bash +wails3 generate syso \ + -arch amd64 \ + -icon windows/icon.ico \ + -manifest windows/wails.exe.manifest \ + -info windows/info.json \ + -out ../wails_windows_amd64.syso +``` + +--- + +### 4. `wails3 generate webview2bootstrapper` +**生成 Windows WebView2 引导程序** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-dir` | 输出目录 | `build/windows/nsis` | + +**使用位置:** `build/windows/Taskfile.yml:55` + +**完整命令:** +```bash +wails3 generate webview2bootstrapper -dir "build/windows/nsis" +``` + +**说明:** 下载 Microsoft Edge WebView2 运行时安装程序,用于 NSIS 打包。 + +--- + +### 5. `wails3 generate .desktop` +**生成 Linux .desktop 桌面文件** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-name` | 应用名称 | `voidraft` | +| `-exec` | 可执行文件名 | `voidraft` | +| `-icon` | 图标名称 | `appicon` | +| `-outputfile` | 输出文件路径 | `build/linux/voidraft.desktop` | +| `-categories` | 应用分类 | `Development;` | + +**使用位置:** `build/linux/Taskfile.yml:107` + +**完整命令:** +```bash +wails3 generate .desktop \ + -name "voidraft" \ + -exec "voidraft" \ + -icon "appicon" \ + -outputfile build/linux/voidraft.desktop \ + -categories "Development;" +``` + +--- + +### 6. `wails3 generate appimage` +**生成 Linux AppImage 包** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-binary` | 二进制文件名 | `voidraft` | +| `-icon` | 图标文件路径 | `../../appicon.png` | +| `-desktopfile` | .desktop 文件路径 | `../voidraft.desktop` | +| `-outputdir` | 输出目录 | `../../../bin` | +| `-builddir` | 构建临时目录 | `build/linux/appimage/build` | + +**使用位置:** `build/linux/Taskfile.yml:49` + +**完整命令:** +```bash +wails3 generate appimage \ + -binary voidraft \ + -icon ../../appicon.png \ + -desktopfile ../voidraft.desktop \ + -outputdir ../../../bin \ + -builddir build/linux/appimage/build +``` + +**说明:** 自动下载 linuxdeploy 工具并创建 AppImage。 + +--- + +### 7. `wails3 tool package` (deb) +**创建 Debian/Ubuntu .deb 包** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-name` | 包名称 | `voidraft` | +| `-format` | 包格式 | `deb` | +| `-config` | nfpm 配置文件 | `./build/linux/nfpm/nfpm.yaml` | +| `-out` | 输出目录 | `./bin` | + +**使用位置:** `build/linux/Taskfile.yml:90` + +**完整命令:** +```bash +wails3 tool package \ + -name voidraft \ + -format deb \ + -config ./build/linux/nfpm/nfpm.yaml \ + -out ./bin +``` + +--- + +### 8. `wails3 tool package` (rpm) +**创建 RedHat/CentOS/Fedora .rpm 包** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-name` | 包名称 | `voidraft` | +| `-format` | 包格式 | `rpm` | +| `-config` | nfpm 配置文件 | `./build/linux/nfpm/nfpm.yaml` | +| `-out` | 输出目录 | `./bin` | + +**使用位置:** `build/linux/Taskfile.yml:95` + +**完整命令:** +```bash +wails3 tool package \ + -name voidraft \ + -format rpm \ + -config ./build/linux/nfpm/nfpm.yaml \ + -out ./bin +``` + +--- + +### 9. `wails3 tool package` (archlinux) +**创建 Arch Linux .pkg.tar.zst 包** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `-name` | 包名称 | `voidraft` | +| `-format` | 包格式 | `archlinux` | +| `-config` | nfpm 配置文件 | `./build/linux/nfpm/nfpm.yaml` | +| `-out` | 输出目录 | `./bin` | + +**使用位置:** `build/linux/Taskfile.yml:100` + +**完整命令:** +```bash +wails3 tool package \ + -name voidraft \ + -format archlinux \ + -config ./build/linux/nfpm/nfpm.yaml \ + -out ./bin +``` + +--- + +### 10. `wails3 task` +**执行 Taskfile.yml 中定义的任务** + +| 参数 | 说明 | 示例值 | +|------|------|--------| +| `[taskname]` | 任务名称 | `build`, `package`, `run` | +| `[VAR=value]` | 变量赋值 | `PRODUCTION=true`, `ARCH=amd64` | + +**常用任务:** + +| 任务 | 说明 | 命令 | +|------|------|------| +| `build` | 构建应用 | `wails3 task build PRODUCTION=true` | +| `package` | 打包应用 | `wails3 task package` | +| `run` | 运行应用 | `wails3 task run` | + +**使用位置:** `build/config.yml` + +--- + +## 📊 平台对应命令表 + +| 平台 | 主要命令 | 产物 | +|------|----------|------| +| **Windows** | `generate syso`
`generate webview2bootstrapper` | `.syso` 资源文件
NSIS 安装程序 | +| **Linux** | `generate .desktop`
`generate appimage`
`tool package -format deb/rpm/archlinux` | `.desktop` 文件
`.AppImage`
`.deb` / `.rpm` / `.pkg.tar.zst` | +| **macOS** | `generate icons` | `.icns` 图标
`.app` 应用包 | +| **通用** | `generate bindings`
`generate icons` | TypeScript 绑定
多平台图标 | + +--- + +## 🚀 快速参考 + +### 完整构建流程 + +```bash +# 1. 生成绑定和图标 +wails3 task common:generate:bindings +wails3 task common:generate:icons + +# 2. 构建前端 +cd frontend +npm install +npm run build +cd .. + +# 3. 构建应用(各平台) +cd build/windows && wails3 task build PRODUCTION=true # Windows +cd build/linux && wails3 task build PRODUCTION=true # Linux +cd build/darwin && wails3 task build PRODUCTION=true # macOS + +# 4. 打包应用(各平台) +cd build/windows && wails3 task package # NSIS 安装程序 +cd build/linux && wails3 task package # AppImage + deb + rpm + archlinux +cd build/darwin && wails3 task package # .app bundle +``` + +--- + +## 📝 注意事项 + +1. **变量传递:** Task 命令支持通过 `VAR=value` 格式传递变量 +2. **路径问题:** 相对路径基于 Taskfile.yml 所在目录 +3. **依赖顺序:** 某些任务有依赖关系(通过 `deps:` 定义) +4. **环境变量:** 使用 `env:` 定义的环境变量会自动设置 + +--- + +## 🔗 相关文档 + +- [Wails 3 官方文档](https://v3alpha.wails.io/) +- [Taskfile 语法](https://taskfile.dev/) +- [nfpm 打包工具](https://nfpm.goreleaser.com/) +