fix(posts): apply consultant review corrections to batch-06 and update review pack v2.0

This commit is contained in:
hoelee committed 2026-10-27 20:53:31 +08:00
1 parent b2fdccf284
commit 0e31199510
12 files changed
+1673 -259

No files matched your search

@@ -19,9 +19,9 @@ summary:
detail: "将本地开发到官方 Catalog 发布的打包流程固化,防止动态解释器包名冲突再次发生。"
stack: ["Traefik v3.x", "Go 1.20+", "Yaegi 解释器", "Docker", "Linux 边缘节点"]
jumpLinks:
business: "#交付结果"
business: "#本地测试全绿上云启动暴雷的-go-插件"
architecture: "#yaegi-动态解释器的包名推断规则"
result: "#修复步骤与目录树对齐"
result: "#交付结果"
dynamicCta: true
---
@@ -66,11 +66,11 @@ Traefik 会要求 Yaegi 在插件包中寻找并导出符合中间件契约的
然而,这里隐藏了一个极其隐蔽的契约断层。
在标准的 Go 语言开发中,如果一个仓库的名字带有连字符(如 `traefik-botfilter`),开发者通常会在源码文件首行采用惯用的简短包名(例如 `package botfilter`)。官方的 Go 编译器(`go build`)与测试框架(`go test`)完全允许这种写法,只要同目录下所有文件的 package 声明保持一致即可。
在标准的 Go 语言工程中,模块路径与目录名经常带有连字符(如 `module github.com/hoelee/traefik-botfilter`),而源码文件首行通常声明不带前缀的合法标识符(如 `package botfilter`)。官方 Go 编译器(`gc`)通过模块导入路径可以完美绑定解析。
**但是,Yaegi 并不会读取 `go.mod` 来推断你声明的包名。**
**但是,Yaegi 动态解释器并不走标准 Go 模块语义解析流程。**
Traefik 的插件加载器会硬编码地从 **`moduleName` 的最后一个路径段** 计算期望的包标识符,并且**自动将所有的连字符(`-`)强制替换为下划线(`_`)**:
Traefik 的动态插件加载器会直接从静态配置中 **`moduleName` 的最后一个路径段** 提取包标识符,并且**自动将所有的连字符(`-`)强制转换为下划线(`_`)**:
$$\text{模块路径}: \texttt{github.com/hoelee/traefik-botfilter} \longrightarrow \text{预期包名}: \texttt{traefik\_botfilter}$$