跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[Go 编程语言] goland 自动切换对应 dlv 版本调试程序,同时调试不同 go 版本的项目再也不用担心版本问题


小天管理

已推荐帖子

公司项目用的可能不是最新 go 版本,而我自己折腾一般都是最新版本。但是 goland 没有找到根据不同项目自动切换 dlv 版本的方法。网上都是让 goland 编辑自定义属性 的 bin\idea.properties 文件添加 dlv.path=/xxx ,但这貌似是 goland 的全局配置,也就是所有项目在调试时都使用相同的 dlv 程序。

因此我编写如下代码,用来替换 goland 默认使用的 dlv 程序。该代码会自动识别调试的可执行程序编译的 go 版本,并执行对应 go 版本的 dlv 程序。

只需要在如下路径按照 go 大版本命名存放对应版本 dlv 程序即可。

$GOPATH/bin/dlv.go1.23.exe
$GOPATH/bin/dlv.go1.22.exe
$GOPATH/bin/dlv.go1.21.exe

goland 使用的 dlv 文件就用下面代码编译的可执行程序替换即可。

package main

import (
	"debug/buildinfo"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

func main() {
	var file string
	for i, v := range os.Args {
		if v == "exec" {
			file = os.Args[i+1]
			break
		}
	}
	info, err := buildinfo.ReadFile(file)
	if err != nil {
		panic(err)
	}
	vs := strings.Split(info.GoVersion, ".")

	cmd := exec.Command(
		// install dlv: $GOPATH/bin/dlv.go1.23.exe
		filepath.Join(os.Getenv("GOPATH"), "bin",
			fmt.Sprintf("dlv.%s.%s.exe", vs[0], vs[1])),
		os.Args[1:]...,
	)
	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr

	if err = cmd.Run(); err != nil {
		panic(err)
	}
}
意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

    没有会员可显示

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...