Files
yuanzhipeng a926ee6b1b chore(build): 更新.gitignore配置和清理Wails临时文件
- 添加dist/目录到.gitignore,用于排除打包输出的绿色免安装版
- 添加Wails打包过程中的临时文件和自动生成文件到.gitignore
- 删除build/windows/installer/wails_tools.nsh自动生成文件
- 添加Windows安装器临时目录和Webview2安装文件到忽略列表

feat(docs): 添加万川平台对接文档和产品素材

- 创建万川平台登录到获取模型信息的流程说明文档
- 添加万川平台对接实施计划文档
- 新增产品图片、公司简介图、宣传海报、教程截图、案例展示等素材文件

refactor(runtime): 扩展通知功能类型定义

- 添加NotificationOptions接口定义
- 添加NotificationAction接口定义
- 添加NotificationCategory接口定义
- 扩展通知相关的运行时API类型声明,包括初始化、发送、注册分类等功能
2026-06-25 18:13:11 +08:00

210 lines
8.8 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<#
.SYNOPSIS
一键打包脚本。
.DESCRIPTION
默认产出「绿色免安装版」到 dist\qiweimanager\(不需要 NSIS解压即用
1. 定位 Go / Wails 工具链并注入 PATH。
2. 32 位编译 helper.exe编译 silk 音频解码器。
3. wails build 生成主程序 qiweimanager.exe前端一并编译
4. 汇总主程序 + helper + DLL + 工具 + 默认配置到 dist 目录。
指定 -Installer 时,额外调用现有的 scripts\package-windows.ps1 走 NSIS 生成安装包
(需本机已安装 NSIS
.PARAMETER Installer
额外生成 NSIS 安装包(委托 package-windows.ps1需要 makensis
.PARAMETER SkipTests
跳过 go test。
.PARAMETER GoPath / WailsPath
手动指定工具路径(自动探测失败时使用)。
.EXAMPLE
powershell -ExecutionPolicy Bypass -File scripts\build.ps1
powershell -ExecutionPolicy Bypass -File scripts\build.ps1 -Installer
#>
[CmdletBinding()]
param(
[switch]$Installer,
[switch]$SkipTests,
[string]$GoPath,
[string]$WailsPath
)
$ErrorActionPreference = "Stop"
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$repoRoot = (Resolve-Path (Join-Path $scriptDir "..")).Path
Set-Location $repoRoot
function Write-Step([string]$msg) { Write-Host "==> $msg" -ForegroundColor Cyan }
function Write-Ok([string]$msg) { Write-Host " $msg" -ForegroundColor Green }
function Write-Warn2([string]$msg){ Write-Host " $msg" -ForegroundColor Yellow }
function Resolve-Go {
param([string]$Hint)
$candidates = @()
if ($Hint) { $candidates += $Hint }
$cmd = Get-Command go.exe -ErrorAction SilentlyContinue
if ($cmd) { $candidates += $cmd.Source }
$candidates += "$env:LOCALAPPDATA\Programs\Go\bin\go.exe", "C:\Program Files\Go\bin\go.exe", "C:\Go\bin\go.exe"
foreach ($c in $candidates) { if ($c -and (Test-Path $c)) { return (Resolve-Path $c).Path } }
throw "未找到 Go。请安装 Go 1.24+ 后重试,或用 -GoPath 指定。"
}
function Resolve-Wails {
param([string]$Hint)
$candidates = @()
if ($Hint) { $candidates += $Hint }
$cmd = Get-Command wails.exe -ErrorAction SilentlyContinue
if ($cmd) { $candidates += $cmd.Source }
$candidates += "$env:USERPROFILE\go\bin\wails.exe"
foreach ($c in $candidates) { if ($c -and (Test-Path $c)) { return (Resolve-Path $c).Path } }
throw "未找到 Wails CLI。请先运行 scripts\dev.ps1 安装,或用 -WailsPath 指定。"
}
function Copy-Required {
param([string]$Source, [string]$Destination)
if (-not (Test-Path -LiteralPath $Source)) { throw "缺少资源: $Source" }
$dir = Split-Path -Parent $Destination
if ($dir -and -not (Test-Path -LiteralPath $dir)) { New-Item -ItemType Directory -Force -Path $dir | Out-Null }
Copy-Item -LiteralPath $Source -Destination $Destination -Force
}
# ---- 委托 NSIS 安装包构建 ----
if ($Installer) {
Write-Step "委托 package-windows.ps1 生成 NSIS 安装包"
$pkg = Join-Path $scriptDir "package-windows.ps1"
$pkgArgs = @{}
if ($SkipTests) { $pkgArgs["SkipTests"] = $true }
if ($WailsPath) { $pkgArgs["WailsPath"] = $WailsPath }
& $pkg @pkgArgs
return
}
# ---- 工具链 ----
Write-Step "定位 Go / Wails 工具链"
$go = Resolve-Go -Hint $GoPath
$goBin = Split-Path -Parent $go
$env:PATH = "$goBin;$env:USERPROFILE\go\bin;$env:PATH"
$wails = Resolve-Wails -Hint $WailsPath
Write-Ok "Go: $go"
Write-Ok "Wails: $wails"
$goCache = Join-Path $repoRoot ".gocache"
New-Item -ItemType Directory -Force -Path $goCache | Out-Null
$env:GOCACHE = $goCache
$binDir = Join-Path $repoRoot "build\bin"
$distDir = Join-Path $repoRoot "dist\qiweimanager"
# ---- 测试 ----
if (-not $SkipTests) {
Write-Step "运行 Go 测试 (go test ./...)"
& $go test ./...
Write-Ok "测试通过"
}
# ---- 结束运行中的旧进程,避免覆盖失败 ----
$running = Get-Process -Name "qiweimanager", "qiweimanager-dev", "helper", "helper_auto_reply" -ErrorAction SilentlyContinue
foreach ($p in $running) { Write-Warn2 "结束运行中的进程: $($p.ProcessName) ($($p.Id))"; Stop-Process -Id $p.Id -Force }
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
# ---- 32 位 helper.exe ----
Write-Step "编译 32 位 helper.exe"
$helperOut = Join-Path $binDir "helper.exe"
$oldArch = $env:GOARCH
try {
$env:GOARCH = "386"
Push-Location (Join-Path $repoRoot "helper")
& $go build -trimpath -ldflags "-H windowsgui -s -w" -o $helperOut .
if ($LASTEXITCODE -ne 0) { throw "helper.exe 编译失败 (exit $LASTEXITCODE)" }
} finally {
Pop-Location
if ($null -eq $oldArch) { Remove-Item Env:GOARCH -ErrorAction SilentlyContinue } else { $env:GOARCH = $oldArch }
}
Write-Ok "helper.exe 完成"
# ---- silk 音频解码器(尽力而为,需要 cgo/gcc缺失则跳过仅影响语音消息转码----
Write-Step "编译 silk 音频解码器"
$silkOut = Join-Path $binDir "tools\audio\silkdecode.exe"
$silkBuilt = $false
$hasGcc = [bool](Get-Command gcc -ErrorAction SilentlyContinue)
if (-not $hasGcc) {
Write-Warn2 "未检测到 gccsilkdecode 依赖 cgo 无法编译,跳过。语音消息自动转码功能在此构建中不可用。"
Write-Warn2 "如需启用:安装 MinGW-w64如 winget install -e --id mstorsjo.llvm-mingw 或 choco install mingw再重新打包。"
} else {
New-Item -ItemType Directory -Force -Path (Split-Path $silkOut) | Out-Null
Push-Location (Join-Path $repoRoot "tools\audio\silkdecode")
try {
$oldCgo = $env:CGO_ENABLED
$env:CGO_ENABLED = "1"
& $go build -trimpath -ldflags "-s -w" -o $silkOut .
if ($LASTEXITCODE -eq 0 -and (Test-Path $silkOut)) { $silkBuilt = $true; Write-Ok "silkdecode.exe 完成" }
else { Write-Warn2 "silkdecode 编译失败,已跳过(不影响主程序)。" }
} finally {
Pop-Location
if ($null -eq $oldCgo) { Remove-Item Env:CGO_ENABLED -ErrorAction SilentlyContinue } else { $env:CGO_ENABLED = $oldCgo }
}
}
# ---- 主程序 + 前端 ----
Write-Step "构建主程序 (wails build)"
& $wails build -trimpath -webview2 embed
if ($LASTEXITCODE -ne 0) { throw "wails build 失败 (exit $LASTEXITCODE)" }
$mainExe = Join-Path $binDir "qiweimanager.exe"
if (-not (Test-Path $mainExe)) { throw "主程序未生成: $mainExe" }
Write-Ok "qiweimanager.exe 完成"
# ---- 汇总绿色免安装版 ----
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$distDirWithTime = Join-Path $repoRoot "dist\qiweimanager_$timestamp"
Write-Step "汇总绿色免安装版到 dist\qiweimanager_$timestamp"
if (Test-Path $distDirWithTime) { Remove-Item $distDirWithTime -Recurse -Force }
New-Item -ItemType Directory -Force -Path $distDirWithTime | Out-Null
New-Item -ItemType Directory -Force -Path (Join-Path $distDirWithTime "config\knowledge") | Out-Null
New-Item -ItemType Directory -Force -Path (Join-Path $distDirWithTime "config\materials") | Out-Null
$mainExeWithTime = "qiweimanager_$timestamp.exe"
Copy-Required -Source $mainExe -Destination (Join-Path $distDirWithTime $mainExeWithTime)
Copy-Required -Source $helperOut -Destination (Join-Path $distDirWithTime "helper.exe")
if ($silkBuilt) {
Copy-Required -Source $silkOut -Destination (Join-Path $distDirWithTime "tools\audio\silkdecode.exe")
} else {
Write-Warn2 "dist 不含 silkdecode.exe语音转码功能不可用"
}
Copy-Required -Source (Join-Path $repoRoot "Helper_4.1.33.6009.dll") -Destination (Join-Path $distDirWithTime "Helper_4.1.33.6009.dll")
Copy-Required -Source (Join-Path $repoRoot "Loader_4.1.33.6009.dll") -Destination (Join-Path $distDirWithTime "Loader_4.1.33.6009.dll")
Copy-Item -LiteralPath (Join-Path $repoRoot "requestdata") -Destination (Join-Path $distDirWithTime "requestdata") -Recurse -Force
Copy-Item -LiteralPath (Join-Path $repoRoot "eventdata") -Destination (Join-Path $distDirWithTime "eventdata") -Recurse -Force
# 默认配置(不含真实密钥)
$defaultConfig = @'
{
"callbackConfig": {
"callbackUrl": "",
"callbackToken": "",
"httpPort": "10001",
"enableCallback": false,
"enableCloudAuth": false,
"fileUploadUrl": "",
"deviceCode": ""
},
"lastUpdated": 0
}
'@
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText((Join-Path $distDirWithTime "config\config.json"), $defaultConfig, $utf8NoBom)
[System.IO.File]::WriteAllText((Join-Path $distDirWithTime "config\client_status.json"), "{}", $utf8NoBom)
[System.IO.File]::WriteAllText((Join-Path $distDirWithTime "config\materials\materials.json"), '{"materials":[]}', $utf8NoBom)
Write-Host ""
Write-Step "打包完成"
Write-Ok "绿色免安装版: $distDirWithTime"
Write-Ok "主程序: $mainExeWithTime"
Write-Ok "直接进入该目录双击 $mainExeWithTime 即可运行。"
Write-Host " 如需 NSIS 安装包,请安装 NSIS 后运行: scripts\build.ps1 -Installer" -ForegroundColor DarkGray