88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/wailsapp/wails/v2"
|
|
"github.com/wailsapp/wails/v2/pkg/options"
|
|
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
|
|
"github.com/wailsapp/wails/v2/pkg/options/windows"
|
|
|
|
"huya-go/internal/gui"
|
|
"huya-go/internal/instance"
|
|
)
|
|
|
|
//go:embed all:frontend/dist
|
|
var assets embed.FS
|
|
|
|
func main() {
|
|
// 实例槽位必须在 wails.Run 之前占用:WebView2 的用户数据目录要按实例区分,
|
|
// 而它只能在创建窗口之前设定。占位结果随后注入 App,避免重复占位。
|
|
lease, leaseErr := instance.Acquire()
|
|
writeStartupTrace(fmt.Sprintf("启动: 实例=%s 数据目录=%s", lease.Name(), lease.Paths().DataDir), leaseErr)
|
|
|
|
app := gui.NewApp(lease, leaseErr)
|
|
|
|
appOptions := &options.App{
|
|
Title: "虎牙抢购助手",
|
|
Width: 1280,
|
|
Height: 820,
|
|
MinWidth: 1024,
|
|
MinHeight: 680,
|
|
AssetServer: &assetserver.Options{
|
|
Assets: assets,
|
|
},
|
|
OnStartup: app.Startup,
|
|
OnShutdown: app.Shutdown,
|
|
Bind: []interface{}{
|
|
app,
|
|
},
|
|
}
|
|
// 每个实例一个独立的 WebView2 用户数据目录。Wails 默认用
|
|
// %APPDATA%\<可执行文件名>,所有实例共用,而 WebView2 的一个数据目录
|
|
// 只能有一个浏览器进程,第二个实例会偶发创建环境失败。
|
|
if webviewDir := lease.WebviewUserDataDir(); webviewDir != "" {
|
|
if err := os.MkdirAll(webviewDir, 0o700); err != nil {
|
|
writeStartupTrace("WebView2 用户数据目录创建失败: "+err.Error(), nil)
|
|
} else {
|
|
appOptions.Windows = &windows.Options{WebviewUserDataPath: webviewDir}
|
|
}
|
|
}
|
|
|
|
if err := wails.Run(appOptions); err != nil {
|
|
log.Printf("启动失败: %v", err)
|
|
writeStartupTrace("启动失败: "+err.Error(), nil)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// writeStartupTrace 把每次启动/失败追加到 <用户缓存目录>/huya-go/startup.log。
|
|
//
|
|
// GUI 应用没有控制台,而 WebView2 环境创建失败时 OnStartup 根本不会执行、
|
|
// 应用自己的日志文件也不会生成——那时只有这份文件能说明「窗口为什么没起来」。
|
|
func writeStartupTrace(line string, cause error) {
|
|
dir, err := os.UserCacheDir()
|
|
if err != nil || dir == "" {
|
|
return
|
|
}
|
|
path := filepath.Join(dir, "huya-go", "startup.log")
|
|
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
return
|
|
}
|
|
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer func() { _ = file.Close() }()
|
|
|
|
if cause != nil {
|
|
line = fmt.Sprintf("%s (原因: %v)", line, cause)
|
|
}
|
|
_, _ = fmt.Fprintf(file, "%s pid=%d %s\n", time.Now().Format("2006-01-02 15:04:05.000"), os.Getpid(), line)
|
|
}
|