From 335fcdc1d657f93833a5fd8183f9acb2ed142fc0 Mon Sep 17 00:00:00 2001 From: xlplbo Date: Mon, 7 Sep 2026 21:21:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(plugin):=20=E6=8F=90=E4=BA=A4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8C=85=E5=89=8D=E5=85=88=E5=85=B3=E9=97=AD=20ZIP=20?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01SAJmqcVA9TLacTCD1bLh4i --- backend/internal/service/plugin_package.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/internal/service/plugin_package.go b/backend/internal/service/plugin_package.go index 2ef9130b0c..a6aceaf957 100644 --- a/backend/internal/service/plugin_package.go +++ b/backend/internal/service/plugin_package.go @@ -107,7 +107,14 @@ func (i *PluginPackageInstaller) Install(ctx context.Context, reader io.Reader, if err != nil { return nil, fmt.Errorf("插件包不是有效的 ZIP: %w", err) } - defer func() { _ = archive.Close() }() + archiveClosed := false + closeArchive := func() { + if !archiveClosed { + archiveClosed = true + _ = archive.Close() + } + } + defer closeArchive() manifest, _, signatureStatus, err := i.inspectArchive(&archive.Reader) if err != nil { return nil, err @@ -137,6 +144,8 @@ func (i *PluginPackageInstaller) Install(ctx context.Context, reader io.Reader, if err := i.extractArchive(ctx, &archive.Reader, manifest, extractPath); err != nil { return nil, err } + // Windows 不允许重命名仍被打开的文件,提交前先释放 ZIP 读取器。 + closeArchive() if err := os.Rename(extractPath, installPath); err != nil { return nil, fmt.Errorf("提交插件安装目录: %w", err) }