Files
qiweimanager-master/scripts/dev.ps1
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

214 lines
9.5 KiB
PowerShell
Raw 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
自动完成以下工作,然后运行 `wails dev`
1. 定位 Go 与 Wails CLI即使未写入 PATH 也能找到常见安装位置)。
2. 把 Go / Wails 注入当前会话 PATH并设置 GOCACHE 到仓库内的 .gocache。
3. 首次运行时自动安装前端依赖frontend/node_modules与 Go 模块。
4. 校验企业微信调试所需的 helper.exe 与 DLL 是否在运行目录。
5. 启动 wails dev前端热更新 + Go 热重载)。
.PARAMETER SkipInstall
跳过依赖安装检查,直接启动(依赖已装好时更快)。
.PARAMETER GoPath
手动指定 go.exe 路径(自动探测失败时使用)。
.PARAMETER WailsPath
手动指定 wails.exe 路径(自动探测失败时使用)。
.EXAMPLE
powershell -ExecutionPolicy Bypass -File scripts\dev.ps1
#>
[CmdletBinding()]
param(
[switch]$SkipInstall,
[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 }
# ---- 定位 Go ----
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"
$candidates += "C:\Program Files\Go\bin\go.exe"
$candidates += "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 指定 go.exe。"
}
# ---- 定位 Wails CLI ----
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 } }
return $null
}
# ---- 环境准备 ----
Write-Step "定位 Go / Wails 工具链"
$go = Resolve-Go -Hint $GoPath
$goBin = Split-Path -Parent $go
$goPathBin = Join-Path $env:USERPROFILE "go\bin"
$env:PATH = "$goBin;$goPathBin;$env:PATH"
Write-Ok "Go: $go"
$wails = Resolve-Wails -Hint $WailsPath
if (-not $wails) {
Write-Warn2 "未找到 Wails CLI正在安装go install..."
& $go install github.com/wailsapp/wails/v2/cmd/wails@latest
$wails = Resolve-Wails
if (-not $wails) { throw "Wails CLI 安装失败,请检查网络或 GOPROXY。" }
}
Write-Ok "Wails: $wails"
# GOCACHE 放仓库内,避免污染系统缓存
$goCache = Join-Path $repoRoot ".gocache"
New-Item -ItemType Directory -Force -Path $goCache | Out-Null
$env:GOCACHE = $goCache
# ---- 依赖安装 ----
if (-not $SkipInstall) {
$nodeModules = Join-Path $repoRoot "frontend\node_modules"
if (-not (Test-Path $nodeModules)) {
Write-Step "安装前端依赖 (npm install)"
Push-Location (Join-Path $repoRoot "frontend")
try { & npm install } finally { Pop-Location }
Write-Ok "前端依赖安装完成"
} else {
Write-Ok "前端依赖已存在,跳过 npm install"
}
Write-Step "同步 Go 模块 (go mod download)"
& $go mod download
Write-Ok "Go 模块就绪"
}
# ---- 编译 32 位 helper.exe统一用正确链接参数杜绝手动编错导致主程序拉起即崩----
# helper 必须 GOARCH=386 且带 -H windowsgui主程序是 GUI 子系统,用 CreateProcess 拉起 helper 时
# 不分配控制台;若 helper 误编成默认 console 子系统(漏掉 -H windowsgui被主程序拉起后会因标准
# 句柄处理立即崩溃——表现为主程序日志「辅助程序已成功启动 PID=xxxx」但该 PID 秒退、不写日志、
# 10001 端口无人监听、前端“启动企微”无反应、满屏 dial tcp [::1]:10001 拒绝连接。诡异之处在于
# console 版 helper 在终端手动运行一切正常,只有被主程序拉起才崩,极易误判为二进制本身没问题。
# 这里每次 dev 启动都用与 scripts\build.ps1 完全一致的参数重编 helper既保证 helper 源码改动生效,
# 又把“唯一正确的编译方式”固化进脚本,从源头消除编错风险。
Write-Step "编译 32 位 helper.exe"
$binDir = Join-Path $repoRoot "build\bin"
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
$helperOut = Join-Path $binDir "helper.exe"
# 先停掉可能占用 helper.exe 的残留进程,否则无法覆盖输出文件。
Get-Process -Name "helper", "helper_auto_reply" -ErrorAction SilentlyContinue | ForEach-Object {
Write-Warn2 "结束残留 helper 进程 (PID $($_.Id))"
Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue
}
$oldArch = $env:GOARCH
$oldCgo = $env:CGO_ENABLED
try {
$env:GOARCH = "386"
$env:CGO_ENABLED = "0"
Push-Location (Join-Path $repoRoot "helper")
& $go build -trimpath -ldflags "-H windowsgui -s -w" -o $helperOut .
$helperExit = $LASTEXITCODE
} finally {
Pop-Location
if ($null -eq $oldArch) { Remove-Item Env:GOARCH -ErrorAction SilentlyContinue } else { $env:GOARCH = $oldArch }
if ($null -eq $oldCgo) { Remove-Item Env:CGO_ENABLED -ErrorAction SilentlyContinue } else { $env:CGO_ENABLED = $oldCgo }
}
if ($helperExit -ne 0) { throw "helper.exe 编译失败 (exit $helperExit)。企业微信链路将不可用,请检查 helper 目录源码。" }
# 子系统自检windowsgui 版的 PE 头 Subsystem 字段为 2GUIconsole 版为 3。若意外编出 console 版直接拦下。
try {
$bytes = [System.IO.File]::ReadAllBytes($helperOut)
$peOff = [System.BitConverter]::ToInt32($bytes, 0x3C) # e_lfanew → PE 头偏移
$subsystem = [System.BitConverter]::ToUInt16($bytes, $peOff + 0x5C) # OptionalHeader.Subsystem
if ($subsystem -eq 2) {
Write-Ok "helper.exe 已编译 (GOARCH=386, GUI 子系统,可被主程序安全拉起)"
} else {
throw "helper.exe 子系统为 $subsystem(期望 2=GUI。这会导致主程序拉起即崩请确认编译参数含 -H windowsgui。"
}
} catch [System.Management.Automation.RuntimeException] {
throw
} catch {
Write-Warn2 "helper.exe 子系统自检跳过:$($_.Exception.Message)"
}
$wxDlls = @("Helper_4.1.33.6009.dll", "Loader_4.1.33.6009.dll")
foreach ($dll in $wxDlls) {
if (Test-Path (Join-Path $repoRoot $dll)) { Write-Ok "$dll 已就绪" } else { Write-Warn2 "缺少 $dll,企业微信链路可能无法工作" }
}
# wails dev 把主程序与 helper 跑在 build\bin 下helper 需要在自身目录找到这两个 DLL。
# 仓库根目录有 DLL 但 build\bin 没有 → "启动企微"会失败并提示 No Helper_*.dll found。
# 这里把根目录 DLL 同步到 build\binbuild\bin 由 wails 在编译时创建,缺失则跳过,启动后会自动建好;
# 若本次启动后仍报缺 DLL再次运行本脚本即可补齐
$binDir = Join-Path $repoRoot "build\bin"
if (Test-Path $binDir) {
foreach ($dll in $wxDlls) {
$src = Join-Path $repoRoot $dll
if (-not (Test-Path $src)) { continue }
$dst = Join-Path $binDir $dll
# 目标已是同样大小则无需复制(避免覆盖正被 helper 占用的 DLL 而报错)
if ((Test-Path $dst) -and ((Get-Item $dst).Length -eq (Get-Item $src).Length)) {
Write-Ok "$dll 已在 build\bin无需同步"
continue
}
try {
Copy-Item -LiteralPath $src -Destination $dst -Force
Write-Ok "已同步 $dll 到 build\bin"
} catch {
if (Test-Path $dst) {
Write-Warn2 "$dll 正被占用无法更新,但 build\bin 已有可用副本,继续。"
} else {
Write-Warn2 "同步 $dll 到 build\bin 失败且目标缺失:$($_.Exception.Message)。请先结束残留 helper.exe 再重试。"
}
}
}
} else {
Write-Warn2 "build\bin 尚不存在(首次编译后才会创建)。若启动后“启动企微”提示缺少 DLL请重新运行本脚本以同步。"
}
# helper 运行时要在自身目录build\bin下按消息类型号读取 eventdata\<type>.json 模板来翻译企微事件。
# 若 build\bin 缺少 eventdataTransformData 会走兜底分支并丢掉顶层 type 字段,导致文本消息被误判成图片、
# 触发图片识别失败并反复回复“无法识别这条图片/视频内容”。requestdata 同理为运行时资源。
# 这里每次 dev 启动都把仓库根目录的 eventdata/requestdata 同步到 build\bin从源头杜绝该问题复发。
if (Test-Path $binDir) {
foreach ($resource in @("eventdata", "requestdata")) {
$src = Join-Path $repoRoot $resource
if (-not (Test-Path $src)) { Write-Warn2 "仓库缺少 $resource 目录,跳过同步"; continue }
$dst = Join-Path $binDir $resource
try {
Copy-Item -LiteralPath $src -Destination $binDir -Recurse -Force
Write-Ok "已同步 $resource 到 build\bin"
} catch {
Write-Warn2 "同步 $resource 到 build\bin 失败:$($_.Exception.Message)"
}
}
}
# ---- 启动 ----
Write-Step "启动 wails devCtrl+C 退出)"
Write-Host ""
& $wails dev