diff --git a/local-tool/visiona-local/app.go b/local-tool/visiona-local/app.go index 57bde8b..b31f16e 100644 --- a/local-tool/visiona-local/app.go +++ b/local-tool/visiona-local/app.go @@ -698,12 +698,13 @@ func locateBundledPythonAssets() (tarball, wheelsDir string, err error) { } } - // 2. 開發模式 fallback + // 2. 開發模式 fallback(依 GOOS 挑對應 payload 子目錄) if cwd, e := os.Getwd(); e == nil { + osName := runtime.GOOS // darwin / windows / linux candidates := []struct{ t, w string }{ - {filepath.Join(cwd, "payload", "darwin", "python", "python.tar.gz"), filepath.Join(cwd, "payload", "darwin", "wheels")}, - {filepath.Join(cwd, "..", "payload", "darwin", "python", "python.tar.gz"), filepath.Join(cwd, "..", "payload", "darwin", "wheels")}, - {filepath.Join(cwd, "..", "..", "payload", "darwin", "python", "python.tar.gz"), filepath.Join(cwd, "..", "..", "payload", "darwin", "wheels")}, + {filepath.Join(cwd, "payload", osName, "python", "python.tar.gz"), filepath.Join(cwd, "payload", osName, "wheels")}, + {filepath.Join(cwd, "..", "payload", osName, "python", "python.tar.gz"), filepath.Join(cwd, "..", "payload", osName, "wheels")}, + {filepath.Join(cwd, "..", "..", "payload", osName, "python", "python.tar.gz"), filepath.Join(cwd, "..", "..", "payload", osName, "wheels")}, } for _, c := range candidates { if fileExists(c.t) && dirExists(c.w) { @@ -712,7 +713,7 @@ func locateBundledPythonAssets() (tarball, wheelsDir string, err error) { } } - return "", "", fmt.Errorf("bundled python assets not found (tried .app Resources + payload/darwin)") + return "", "", fmt.Errorf("bundled python assets not found (tried .app Resources + same-dir + payload/%s)", runtime.GOOS) } // locateBundleBinDir 找 bundle 內的 bin 目錄(含 ffmpeg / yt-dlp / visiona-local-server)。 @@ -743,12 +744,13 @@ func locateBundleBinDir() (string, error) { } } - // 開發模式 fallback + // 開發模式 fallback(依 GOOS 挑對應 payload 子目錄) if cwd, err := os.Getwd(); err == nil { + osName := runtime.GOOS // darwin / windows / linux candidates := []string{ - filepath.Join(cwd, "payload", "darwin", "bin"), - filepath.Join(cwd, "..", "payload", "darwin", "bin"), - filepath.Join(cwd, "..", "..", "payload", "darwin", "bin"), + filepath.Join(cwd, "payload", osName, "bin"), + filepath.Join(cwd, "..", "payload", osName, "bin"), + filepath.Join(cwd, "..", "..", "payload", osName, "bin"), } for _, c := range candidates { if dirExists(c) { @@ -1210,10 +1212,12 @@ func oldDataDirCandidates() []string { // locateServerBinary 找 visiona-local-server 執行檔。 // // 搜尋順序: -// 1. 與 Wails app 可執行檔同目錄(打包後的位置) -// 2. macOS app bundle 內:Contents/MacOS/ 或 Contents/Resources/ -// 3. 開發模式:/dist/visiona-local-server(相對 cwd) -// 4. 開發模式:/server/visiona-local-server +// 1. 與 Wails app 可執行檔同目錄下的 bin/(Windows/Linux installer 佈局,Inno Setup .iss 裝到 {app}\bin) +// 2. 與 Wails app 可執行檔同目錄(開發/舊佈局) +// 3. macOS app bundle 內:Contents/Resources/bin 或 Contents/Resources +// 4. 開發模式:/payload//bin/visiona-local-server +// 5. 開發模式:/dist/visiona-local-server +// 6. 開發模式:/server/visiona-local-server func locateServerBinary() (string, error) { binName := "visiona-local-server" if runtime.GOOS == "windows" { @@ -1222,12 +1226,15 @@ func locateServerBinary() (string, error) { candidates := []string{} - // 1. 與 Wails app 同目錄 + // 1-2. 打包後佈局(installer 生成的目錄結構) if exe, err := os.Executable(); err == nil { exeDir := filepath.Dir(exe) + // {app}\bin\visiona-local-server.exe — Windows / Linux installer 標準佈局 + candidates = append(candidates, filepath.Join(exeDir, "bin", binName)) + // {app}\visiona-local-server.exe — exe 跟 server 同目錄的扁平佈局 candidates = append(candidates, filepath.Join(exeDir, binName)) - // 2. macOS app bundle 常見位置 + // 3. macOS app bundle 佈局 if runtime.GOOS == "darwin" { candidates = append(candidates, filepath.Join(exeDir, "..", "Resources", "bin", binName), @@ -1237,9 +1244,12 @@ func locateServerBinary() (string, error) { } } - // 3-4. 開發模式 + // 4-6. 開發模式 if cwd, err := os.Getwd(); err == nil { + osName := runtime.GOOS // darwin / windows / linux candidates = append(candidates, + filepath.Join(cwd, "payload", osName, "bin", binName), + filepath.Join(cwd, "..", "payload", osName, "bin", binName), filepath.Join(cwd, "dist", binName), filepath.Join(cwd, "..", "dist", binName), filepath.Join(cwd, "server", binName),