From 9247fe8e6345f7d01d7134ca240e86abb8a7b25c Mon Sep 17 00:00:00 2001 From: xiyidaiwa Date: Mon, 10 Aug 2026 08:27:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=90=88=E5=B9=B6=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=AD=90=E7=89=88=E7=9B=B8=E5=8F=8D=E5=91=BD=E4=B8=AD=E6=97=B6?= =?UTF-8?q?=E6=8C=89=20apmPriority=20=E4=BE=8B=E5=A4=96=E4=BC=98=E5=85=88?= =?UTF-8?q?=E8=A3=81=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getHybridDefaultOrigin 原先对合并应用子版采用「spark 先于 apm」短路返回, 当 sparkApp 命中 sparkPriority 且 apmApp 命中 apmPriority(方向相反)时, 会错误返回 spark,违反 priority-config.json 中 apmPriority「例外优先」语义。 改为先收集两子版命中结果,方向相反时让 apm 胜出;仅单子版命中或同向时 维持原行为。已用 Node 复现验证(相反命中返回 apm、对照旧逻辑返回 spark)。 --- src/global/storeConfig.ts | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/global/storeConfig.ts b/src/global/storeConfig.ts index 80c10e1a..f7e23a38 100644 --- a/src/global/storeConfig.ts +++ b/src/global/storeConfig.ts @@ -180,6 +180,7 @@ function matchPriority(app: App): "apm" | "spark" | null { * 获取混合模式下应用的默认优先来源(即「应用配置优先级」)。 * 对合并应用,依次用顶层标识、sparkApp、apmApp 去匹配优先级配置, * 任一来源命中即生效(避免顶层 pkgname 取自某一子版而漏掉另一子版的规则)。 + * 若两子版方向相反命中,遵从 apmPriority「例外优先」语义让 apm 胜出。 * 均不命中时回退到 HYBRID_DEFAULT_PRIORITY(默认优先 APM)。 * @param app 应用信息 * @returns "apm" 或 "spark" @@ -193,20 +194,17 @@ export function getHybridDefaultOrigin(app: App): "apm" | "spark" { // 回退使用顶层 app.category 参与分类规则匹配,避免漏匹配。 if (app.isMerged) { const fallbackCategory = app.category; - if (app.sparkApp) { - const sparkCandidate: App = app.sparkApp.category - ? app.sparkApp - : { ...app.sparkApp, category: fallbackCategory }; - const r = matchPriority(sparkCandidate); - if (r) return r; - } - if (app.apmApp) { - const apmCandidate: App = app.apmApp.category - ? app.apmApp - : { ...app.apmApp, category: fallbackCategory }; - const r = matchPriority(apmCandidate); - if (r) return r; - } + // 构造 category 回退顶层的候选项,避免子版 category 为空时分类规则漏匹配 + const toCandidate = (sub: App): App => + sub.category ? sub : { ...sub, category: fallbackCategory }; + const sparkHit = app.sparkApp ? matchPriority(toCandidate(app.sparkApp)) : null; + const apmHit = app.apmApp ? matchPriority(toCandidate(app.apmApp)) : null; + + // apmPriority 是「例外优先于 sparkPriority」:当两子版方向相反命中 + //(sparkApp 命中 spark 且 apmApp 命中 apm)时,按配置语义让 apm 胜出。 + if (sparkHit === "spark" && apmHit === "apm") return "apm"; + if (sparkHit) return sparkHit; + if (apmHit) return apmHit; } // 默认行为:与 HYBRID_DEFAULT_PRIORITY 保持一致(默认优先 APM)