From 2f766b41848f62219675eb56209fb4059c651159 Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Fri, 7 Aug 2026 21:50:21 +0800 Subject: [PATCH] =?UTF-8?q?Windows=E7=AB=AFfrpc=E4=BA=8C=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E7=9A=84=E8=A7=A3=E5=8E=8B=E8=B0=83=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/frp/binary.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/internal/frp/binary.go b/internal/frp/binary.go index c81a8c1..ce90853 100644 --- a/internal/frp/binary.go +++ b/internal/frp/binary.go @@ -50,28 +50,38 @@ func GetFrpcPath() (string, error) { return "", fmt.Errorf("不支持的平台: %s/%s", runtime.GOOS, runtime.GOARCH) } + // 尝试从本地 bin 目录加载 localPath := filepath.Join(".", "bin", fileName) if _, err := os.Stat(localPath); err == nil { cachedFrpcPath = localPath return localPath, nil } + // 从 embed 提取到 data 目录(Windows 和 Linux 统一) + dataDir := "./data" + if err := os.MkdirAll(dataDir, 0755); err != nil { + return "", fmt.Errorf("创建 data 目录失败: %w", err) + } + + tmpPath := filepath.Join(dataDir, "frpc") + if runtime.GOOS == "windows" { + tmpPath += ".exe" + } + data, err := embeddedFrpc.ReadFile("bin/" + fileName) if err == nil { - tmpPath := filepath.Join(os.TempDir(), "frpc") - if runtime.GOOS == "windows" { - tmpPath += ".exe" - } if err := os.WriteFile(tmpPath, data, 0755); err == nil { cachedFrpcPath = tmpPath return tmpPath, nil } + // 如果写入失败,检查文件是否已存在 if _, statErr := os.Stat(tmpPath); statErr == nil { cachedFrpcPath = tmpPath return tmpPath, nil } } + // 最后尝试从系统 PATH 查找 path, err := exec.LookPath("frpc") if err == nil { cachedFrpcPath = path