mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-20 00:48:12 +00:00
feat(hmapdev): 项目声明 SDK 版本,工具链据此自动选(plg.json 的 sdk 字段)
此前项目里没有任何「我要哪版 SDK」的声明:go.mod 的 require 是个 Go 模块版本, 而工具链实际用的是存储里的 current——谁改过 current 就拿谁的版本编,出错时 表现为莫名其妙的编译错误(本轮就踩过:存储里只有陈旧的 v0.8.0,模板项目 首次构建报 undefined: sdk.InjectOptions)。 - `plg.json` 新增 `sdk` 字段:本插件针对的 SDK 版本。`hmapdev init` 生成时写入 **完整版本号**(如 "1.2.0")。 - `hmapdev build` 按声明的版本在本地 SDK 存储里定位:命中则用它并把 go.mod 的 require/replace 同步到该版本;未命中则报**可执行**的错误(列出已装版本 + `hmapdev sdk install vX.Y.Z`),绝不静默退化成 current。 - **区间写法("1.2")被拒绝**并说明规矩:SDK 版本跟随内核中版本、patch 位恒为 .0, 一条内核线只有一个 SDK 版本(写区间会让人误以为同一条线里还能挑不同 SDK)。 - 产物 `plugin.json` 记录实际选中的版本(`sdk`),便于追溯「这个 .hmap 是哪版编的」。 - 显式 `--sdk-path` / `plg.json sdk_path` 优先(本机改 SDK 联调的路径),此路径下也尽力记录版本。 - 存量项目(plg.json 无 sdk 字段)行为不变,向后兼容。 顺带修一处自相矛盾:解析出 1.2.0 之外的版本时,原先只改 replace 而 require 保持旧版本, 一旦有人删掉 replace 就会静默用回旧 SDK 编译(`go list -m` 报的也是假版本)。 验证:单测 10 例(精确命中/带 v 前缀目录/区间写法被拒并说明规矩/未命中给可执行命令/ 空存储给安装指引/非法值拒绝/杂项目录不干扰)+ 反向验证(把版本比较退化成字典序, 「1.2.x 取最新」用例立刻变红,证明判据能发现缺陷)。 E2E:init → plg.json `"sdk": "1.2.0"`;build → 精确解析、go.mod require/replace 一致、 产物 plugin.json 记录 sdk;声明不存在的版本 → 可执行报错;无 sdk 字段 → 照旧构建。
This commit is contained in:
@ -79,6 +79,22 @@ func cmdBuild(args []string) {
|
||||
return
|
||||
}
|
||||
|
||||
// 项目可在 plg.json 里声明 sdk(中版本或完整版本,如 "1.2" / "1.2.1");
|
||||
// 显式 --sdk-path / plg.json 的 sdk_path 优先 —— 那是直指源码目录,
|
||||
// 常用于本机改 SDK 的联调场景。
|
||||
if sdkPath == "" && strings.TrimSpace(plg.SDK) != "" {
|
||||
dir, ver, err := ResolveSDKForProject(plg.SDK)
|
||||
if err != nil {
|
||||
fmt.Printf("error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
sdkPath, plg.ResolvedSDK = dir, ver
|
||||
fmt.Printf("[hmapdev] SDK %s(项目声明 sdk=%s)\n", ver, plg.SDK)
|
||||
} else if sdkPath != "" && plg.ResolvedSDK == "" {
|
||||
// 走的是显式路径:尽力记录它是哪版(读不到就不记,不因此失败)
|
||||
plg.ResolvedSDK = normalizeSDKVersion(readMetaVersion(sdkPath))
|
||||
}
|
||||
|
||||
// Ensure go.mod exists with correct SDK path
|
||||
sdkModule := ensureGoMod(plg, sdkPath)
|
||||
|
||||
@ -269,6 +285,10 @@ func writePluginJSON(plg *PlgConfig, platforms []string, entry string) {
|
||||
if len(plg.Tags) > 0 {
|
||||
m["tags"] = plg.Tags
|
||||
}
|
||||
// 记录「用哪版 SDK 编的」:插件产物与内核协议绑定,出问题时这是第一个要看的字段。
|
||||
if plg.ResolvedSDK != "" {
|
||||
m["sdk"] = plg.ResolvedSDK
|
||||
}
|
||||
data, _ := json.MarshalIndent(m, "", " ")
|
||||
os.WriteFile("plugin.json", data, 0644)
|
||||
}
|
||||
@ -370,7 +390,28 @@ func ensureGoMod(plg *PlgConfig, sdkPath string) string {
|
||||
}
|
||||
keep = append(keep, line)
|
||||
}
|
||||
if alreadyExists {
|
||||
// 同步 require 版本:replace 指向 1.2.1 而 require 还写 1.2.0 是自相矛盾的
|
||||
// —— 有人删掉 replace 就会静默退回旧版本去编(`go list -m` 报的也是假版本)。
|
||||
// 以本次真正选中的版本为准改写 require 行。
|
||||
requireChanged := false
|
||||
if v := normalizeSDKVersion(plg.ResolvedSDK); v != "" {
|
||||
want := "require " + sdkModule + " v" + v
|
||||
for i, line := range keep {
|
||||
t := strings.TrimSpace(line)
|
||||
if !strings.HasPrefix(t, "require ") {
|
||||
continue
|
||||
}
|
||||
parts := strings.Fields(t)
|
||||
if len(parts) >= 3 && parts[1] == sdkModule {
|
||||
indent := line[:len(line)-len(strings.TrimLeft(line, " \t"))]
|
||||
if t != want {
|
||||
keep[i] = indent + want
|
||||
requireChanged = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if alreadyExists && !requireChanged {
|
||||
return sdkModule
|
||||
}
|
||||
keep = append(keep, replaceLine, "")
|
||||
|
||||
Reference in New Issue
Block a user