xhd2015/xgo

xgo 更好的集成 goland vscode 这种 IDE 工具

alpha-baby opened this issue · 13 comments

我简单的翻了一下 xgo 的源码,xgo 大概的原理就是:

  1. 使用了 golang compile 的 -toolexec
  2. 重新拷贝了 GOROOT下面的代码到 ~/.xgo/go-instrument/go1.22.1_Us_fu_.x_go_go_go_61604acb (go1.22.1_Us_fu_.x_go_go_go_61604acb 是自动生成的,每个人的电脑应该是不一样的,可以进入到目录 ~/.xgo/go-instrument/ 中去查看)
  3. 然后对 go 的很多源文件打了一些补丁
  4. 然后再重新编译 go 的 compile
  5. 然后再增加和修改了一些 环境变量
  6. 然后再运行 go build 或者 go test 等去编译用户的业务代码

以上的过程可以通过去 debug xgo 的代码去梳理出来,然后也可以执行 xgo 的时候加上参数xgo test --log-debug --debug 打印出详细的日志

goland 中设置配置

目前来说如果你想更友好的在 goland 中使用 xgo ,你可以修改 Settings->GO->GOROOT 修改成 上面 xgo 给你生成出来的 goroot

例如我这里把他改成了:

image

然后再修改 goland 的运行配置(Run/Debug Configurations)

添加环境变量

image

添加编译参数

image

上面截图中的配置都不需要从图中抄过去,而是在命令行中使用下 xgo 去跑一下本地的单测,在跑的时候加上 --log-debug --debug 参数,更多的参数可以通过运行 xgo help 来查看

总结

说实话这样配置一遍挺复杂的,但是在 vscode 中使用 xgo 应该是比较容易的,运维 vscode 中可以自定义编译命令,不详细展开了,如果你已经是使用 vscode 的老手,应该知道我在讲什么。

希望作者重新考虑下怎么在 goland 中更方便快捷的使用 xgo ,如果大家有更好的办法希望留言!

是的,这个是我们希望解决的问题。目前的做法是运行xgo e来打开一个统一的test管理工具,如下图所示:

xgo e

使用这个工具执行用例的时候,默认以xgo test来执行测试用例

image

IDE的集成,目前还没有特别好的办法。

IDE 集成的话,如果是想让用户用起来最爽的就是开发一个 xgo 的 vscode 或者 goland 插件,

我刚刚试了试 xgo e 还是挺好用的,但是看起来这里有个 bug,这个测试完成后并没有在左边显示完成,也没有显示测试失败

image

目前的做法是运行xgo e来打开一个统一的test管理

感谢反馈,这个问题我之前也有记录:#198

我抽时间修复一下,最近工作上的事情比较忙,没来得及搞。

test-explorer的源码:https://github.com/xhd2015/coverage-visualizer/blob/master/src/mock-editor/TestingExplorer/xgo/XgoTestingExplorer.tsx

IDE 集成的话,如果是想让用户用起来最爽的就是开发一个 xgo 的 vscode 或者 goland 插件,

关于插件,目前是希望对vscode-go提一个PR,能够支持指定xgo进行测试。
之前ginko也有一个类似issue:onsi/ginkgo#1400

IDE 集成的话,如果是想让用户用起来最爽的就是开发一个 xgo 的 vscode 或者 goland 插件,

关于插件,目前是希望对vscode-go提一个PR,能够支持指定xgo进行测试。 之前ginko也有一个类似issue:onsi/ginkgo#1400

想法是比较好的,但是我感觉进 vscode-go 的官方插件是比较难的,因为 ginkgo xgo 这些是第三方开发工具,对于 go 团队来说比较难维护,除非 ginkgo xgo 这些成为了 go 官方的工具。但是我觉得这个更难。我还是觉得自己搞插件这个路子更好走一些。

也是个方向,可以基于当前xgo的前端代码来做

@alpha-baby xgo 1.0.41发布了,这个版本的xgo e体验会好很多

在使用vscode时似乎可以编写简单的配置使用wrapped go,例如:

"go.alternateTools": {
        "go": "C:/coding/golang/bin/xgo.exe"
    }

但是这样的话实际上完全用不了,因为获取env报错,导致扩展似乎没法正常加载,例如:
image

所以希望xgo能够直接转发golang的其他子命令,例如go env:

if cmd != "build" && cmd != "run" && cmd != "test" && cmd != "exec" {
	fmt.Fprintf(os.Stderr, "xgo %s: unknown command\nRun 'xgo help' for usage.\n", cmd)
	os.Exit(1)
}

在使用vscode时似乎可以编写简单的配置使用wrapped go,例如:

"go.alternateTools": {
        "go": "C:/coding/golang/bin/xgo.exe"
    }

但是这样的话实际上完全用不了,因为获取env报错,导致扩展似乎没法正常加载,例如: image

所以希望xgo能够直接转发golang的其他子命令,例如go env:

if cmd != "build" && cmd != "run" && cmd != "test" && cmd != "exec" {
	fmt.Fprintf(os.Stderr, "xgo %s: unknown command\nRun 'xgo help' for usage.\n", cmd)
	os.Exit(1)
}

@WAY29 xgo不会转发任何命令,实际上,转发可以通过xgo shadow来做。具体来说:

  1. 运行xgo shadow, 输出: /Users/someone/.xgo/shadow
  2. 然后设置
{
  "go.alternateTools":{
    "go":"/Users/someone/.xgo/shadow/go"
  }
}

在使用vscode时似乎可以编写简单的配置使用wrapped go,例如:

"go.alternateTools": {
        "go": "C:/coding/golang/bin/xgo.exe"
    }

但是这样的话实际上完全用不了,因为获取env报错,导致扩展似乎没法正常加载,例如: image
所以希望xgo能够直接转发golang的其他子命令,例如go env:

if cmd != "build" && cmd != "run" && cmd != "test" && cmd != "exec" {
	fmt.Fprintf(os.Stderr, "xgo %s: unknown command\nRun 'xgo help' for usage.\n", cmd)
	os.Exit(1)
}

@WAY29 xgo不会转发任何命令,实际上,转发可以通过xgo shadow来做。具体来说:

  1. 运行xgo shadow, 输出: /Users/someone/.xgo/shadow
  2. 然后设置
{
  "go.alternateTools":{
    "go":"/Users/someone/.xgo/shadow/go"
  }
}

报错: xgo shadow not found in PATH: 然而根据环境变量,我是能找到xgo.exe的

需要将/Users/someone/.xgo/shadow这个目录加到PATH变量中

需要将/Users/someone/.xgo/shadow这个目录加到PATH变量中

似乎正常工作了,也许我们应该将这个命令放入README和xgo help中,并且将相关的ide配置方法也加入例子?我在这两个地方都没有看到shadow的用法, 另外我注意到,在使用xgo shadow后似乎vscode的coverage也不管用了

xgo shadow还处在一种实验状态,目前Goland没办法使用这种方式进行配置。

期望是改进xgo shadow, 其输出一个完整的Shadow GOROOT。然后Goland和VSCode用户都可以通过配置GOROOT指向Shadow GOROOT就可以了。

目前这个想法还有待验证。