feat: add baihu notify -- fix install
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user