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) }