From 2526bc3beba141b19a91f850dd3f538f19304a6e Mon Sep 17 00:00:00 2001 From: furao Date: Thu, 11 Jun 2026 14:37:24 +0800 Subject: [PATCH] =?UTF-8?q?[mcp]=20=E4=BF=AE=E5=A4=8D:=20restart-package?= =?UTF-8?q?=20=E5=AF=B9=E4=BB=BB=E6=84=8F=E6=89=A9=E5=B1=95=E7=94=9F?= =?UTF-8?q?=E6=95=88(disable/enable=20=E9=A1=BB=E4=BC=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Editor.Package.disable/enable 的参数是扩展绝对路径不是 name(typings: enable(path)/disable(path, options)), 传 name 会 disable 静默不生效 + enable 报 "[Package] Unknown and unable to start", 旧实例(含其 http server 等资源)永久泄漏。改为 getPackages 按 name 反查 path 再调用; 传入已是路径则直接用。实测 guide-editor 按名 reload 后 unload→load 完整执行, 8099 监听 socket 换新 --- main.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/main.js b/main.js index 701c619..8e005bf 100644 --- a/main.js +++ b/main.js @@ -531,16 +531,31 @@ async function doOpenPrefab(urlOrPath) { * 注意:reload 本插件自身时,本函数处于即将被卸载的 main.js 上下文,必须 fire-and-forget。 * Editor.Package.disable 是 host 进程 API,扩展沙箱卸载后仍然有效; * enable 在 disable 完成后用 setTimeout 触发,给 unload 收尾留窗口。 + * ⚠️ disable/enable 的参数是扩展**绝对路径**不是 name(typings: enable(path) / + * disable(path, options))——传 name 会 disable 静默不生效 + enable 报 + * "[Package] Unknown and unable to start",必须先用 getPackages 反查注册路径。 */ function doRestartSelf(name) { name = name || 'cc-3-8-x-mcp'; log('restart-package: scheduling disable → enable for ' + name); setImmediate(function () { Promise.resolve() - .then(function () { return Editor.Package.disable(name, true); }) - // 200ms 给 unload 钩子(stopRefreshWatcher / stopMcpServer)跑完 - .then(function () { return new Promise(function (r) { setTimeout(r, 200); }); }) - .then(function () { return Editor.Package.enable(name, true); }) + .then(function () { + if (name.indexOf('/') >= 0 || name.indexOf('\\') >= 0) return name; // 已是路径直接用 + var list = (Editor.Package.getPackages() || []).filter(function (p) { + return p && (p.name === name || (p.info && p.info.name === name)); + }); + if (!list.length || !list[0].path) { + throw new Error('找不到扩展 "' + name + '" 的注册路径(getPackages 匹配 ' + list.length + ' 条)'); + } + return list[0].path; + }) + .then(function (pkgPath) { + return Promise.resolve(Editor.Package.disable(pkgPath)) + // 200ms 给 unload 钩子(stopRefreshWatcher / stopMcpServer)跑完 + .then(function () { return new Promise(function (r) { setTimeout(r, 200); }); }) + .then(function () { return Editor.Package.enable(pkgPath); }); + }) .catch(function (err) { console.error('[restart-package] failed:', err && (err.stack || err.message) || err); });