feat: add baihu notify -- fix install

This commit is contained in:
duorameng
2026-04-16 21:40:05 +08:00
parent cf38c28489
commit 29d6c64279
2 changed files with 41 additions and 16 deletions
+14 -9
View File
@@ -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()
}
}
}
+26 -6
View File
@@ -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