xgo 更好的集成 goland vscode 这种 IDE 工具
alpha-baby opened this issue · 13 comments
我简单的翻了一下 xgo 的源码,xgo 大概的原理就是:
- 使用了 golang compile 的 -toolexec
- 重新拷贝了 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/ 中去查看) - 然后对 go 的很多源文件打了一些补丁
- 然后再重新编译 go 的 compile
- 然后再增加和修改了一些 环境变量
- 然后再运行 go build 或者 go test 等去编译用户的业务代码
以上的过程可以通过去 debug xgo 的代码去梳理出来,然后也可以执行 xgo 的时候加上参数xgo test --log-debug --debug
打印出详细的日志
goland 中设置配置
目前来说如果你想更友好的在 goland 中使用 xgo ,你可以修改 Settings->GO->GOROOT 修改成 上面 xgo 给你生成出来的 goroot
例如我这里把他改成了:
然后再修改 goland 的运行配置(Run/Debug Configurations)
添加环境变量
添加编译参数
上面截图中的配置都不需要从图中抄过去,而是在命令行中使用下 xgo 去跑一下本地的单测,在跑的时候加上 --log-debug --debug
参数,更多的参数可以通过运行 xgo help
来查看
总结
说实话这样配置一遍挺复杂的,但是在 vscode 中使用 xgo 应该是比较容易的,运维 vscode 中可以自定义编译命令,不详细展开了,如果你已经是使用 vscode 的老手,应该知道我在讲什么。
希望作者重新考虑下怎么在 goland 中更方便快捷的使用 xgo ,如果大家有更好的办法希望留言!
目前的做法是运行
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报错,导致扩展似乎没法正常加载,例如:
所以希望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报错,导致扩展似乎没法正常加载,例如:
所以希望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
来做。具体来说:
- 运行
xgo shadow
, 输出:/Users/someone/.xgo/shadow
- 然后设置
{
"go.alternateTools":{
"go":"/Users/someone/.xgo/shadow/go"
}
}
在使用vscode时似乎可以编写简单的配置使用wrapped go,例如:
"go.alternateTools": { "go": "C:/coding/golang/bin/xgo.exe" }但是这样的话实际上完全用不了,因为获取env报错,导致扩展似乎没法正常加载,例如:
所以希望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
来做。具体来说:
- 运行
xgo shadow
, 输出:/Users/someone/.xgo/shadow
- 然后设置
{ "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就可以了。
目前这个想法还有待验证。