From 29d6c64279dff4162d1debe329a5f0af157883f4 Mon Sep 17 00:00:00 2001 From: duorameng <2997944583@qq.com> Date: Thu, 16 Apr 2026 21:40:05 +0800 Subject: [PATCH] feat: add baihu notify -- fix install --- cmd/builtininstall/builtininstall.go | 25 +++++++++++++--------- internal/utils/mise.go | 32 ++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/cmd/builtininstall/builtininstall.go b/cmd/builtininstall/builtininstall.go index 9e200b8..0559208 100644 --- a/cmd/builtininstall/builtininstall.go +++ b/cmd/builtininstall/builtininstall.go @@ -58,23 +58,25 @@ func installForLanguage(lang, pkgPath, installBaseCmd string) { for _, v := range versions { logger.Infof("[Builtin] 正在为 %s@%s 安装内建包...", lang, v) - var cmdStr string + var subCmdArgs []string if lang == "node" { - // npm install 不需要 -e - cmdStr = fmt.Sprintf("npm install %s", pkgPath) + // 使用 npm i -g 进行全局安装 + subCmdArgs = []string{"npm", "i", "-g", pkgPath} } else { - // python 建议使用 -e (editable) 或直接安装 - cmdStr = fmt.Sprintf("pip install -e %s", pkgPath) + // python 使用 pip install -e + subCmdArgs = []string{"pip", "install", "-e", pkgPath} } - // 使用 mise exec 跨版本执行 - fullCmd := utils.BuildMiseCommandSimple(cmdStr, lang, v) - + // 构建参数列表: [mise, exec, lang@v, --, npm, i, -g, path] + fullArgs := utils.BuildMiseCommandArgsSimple(subCmdArgs, lang, v) + var cmd *exec.Cmd if runtime.GOOS == "windows" { - cmd = exec.Command("cmd", "/c", fullCmd) + // Windows 下仍建议通过 cmd /c 调用 + cmd = exec.Command("cmd", append([]string{"/c"}, fullArgs...)...) } else { - cmd = exec.Command("sh", "-c", fullCmd) + // Linux 系统直接执行参数切片,更稳健 + cmd = exec.Command(fullArgs[0], fullArgs[1:]...) } out, err := cmd.CombinedOutput() @@ -82,6 +84,9 @@ func installForLanguage(lang, pkgPath, installBaseCmd string) { logger.Errorf("[Builtin] 为 %s@%s 安装失败: %v\n输出: %s", lang, v, err, string(out)) } else { logger.Infof("[Builtin] 为 %s@%s 安装成功", lang, v) + // 安装成功后尝试执行 reshim,确保命令生效 + reshimCmd := exec.Command("mise", "reshim", lang) + reshimCmd.Run() } } } diff --git a/internal/utils/mise.go b/internal/utils/mise.go index 44873ca..a835dcf 100644 --- a/internal/utils/mise.go +++ b/internal/utils/mise.go @@ -134,13 +134,33 @@ func ListMiseInstalledVersions(language string) ([]string, error) { if v == "" { continue } - // mise ls 的输出类似: - // 3.12.1 - // 3.11.5 - // 我们取第一个字段即可 + // mise ls 的输出可能包含状态标识或插件名,例: + // * 20.10.0 (active) + // node 18.17.0 fields := strings.Fields(v) - if len(fields) > 0 { - versions = append(versions, fields[0]) + if len(fields) == 0 { + continue + } + + startIdx := 0 + // 跳过状态标识符 + if fields[startIdx] == "*" || fields[startIdx] == "->" || fields[startIdx] == ">" { + startIdx++ + } + + if len(fields) <= startIdx { + continue + } + + vstr := fields[startIdx] + // 如果第一个有效字段是插件名,则版本号在第二个字段 + if vstr == language && len(fields) > startIdx+1 { + vstr = fields[startIdx+1] + } + + // 确保解析出来的不是插件名 + if vstr != "" && vstr != language { + versions = append(versions, vstr) } } return versions, nil