在windows上使用GoLand对vite源码进行构建及调试



  • 本文撰写者:Vite社区用户、安全技术专家晓宇先生

    一、 前置条件

    安装golang及GoLand IDE,以下是官方的指导,在此不再赘述。

    Golang : https://golang.org/doc/install

    GoLand IDE : https://www.jetbrains.com/go/learn/ (30天免费评估期)

    二、建立工程

    1,运行>go get github.com/vitelabs/go-vite, 并等待代码拉取。

    2,代码拉取结束后进入%GOPATH%\src\github.com\vitelabs 路径下,如果前一步执行成功了就会看到vite最新的代码已经在这里下载好了。

    3,运行GoLand,在主界面中选择open project

    选择刚才已经完成源码下载的go-vite路径并确认。

    顺利的话应该看到vite工程已经成功打开了

    三、构建工程
    1,打开标签栏中的Run,并且选择Edit Configurations。

    2,打开Templates的折叠并选择Go Build,默认的情况下对vite编译不需要进行任何设置,只使用默认设置就好,但是为了后续调试方便,我自己定义了输出目录D:\Users\Desktop\vite_output。

    根据源码中makefile的内容可知

    gvite-windows-amd64:
       @echo "package govite" > $(shell pwd)/buildversion.go
       @echo "const VITE_VERSION = \""$(shell git rev-parse HEAD)"\"" >> $(shell pwd)/buildversion.go
       @echo "const VITE_BUILD_VERSION = \""$(VITE_VERSION)"\"" >> $(shell pwd)/buildversion.go
       env GOOS=windows GOARCH=amd64 go build -i -o $(GOBIN)/gvite-$(VITE_VERSION)-windows/gvite-windows-amd64.exe $(SERVERMAIN)
       @cp  $(shell pwd)/node_config.json $(GOBIN)/gvite-$(VITE_VERSION)-windows/node_config.json
       @echo "Build server done."ls
       @ls -ld $(GOBIN)/gvite-$(VITE_VERSION)-windows/gvite-windows-amd64.exe
    

    项目的主要入口就是在gvite这个命令上,所以我们在Package path中选择cmd目录中的gvite路径,完毕后点击Apply和OK,使设置生效。

    3,接下来就要开始编译并运行gvite了,在主界面的选项卡run中点击run,让工程开始编译并执行。

    选择刚刚配置好的build选项开始编译。

    如果一切顺利的话,gvite就应该成功运行起来了。

    #四、调试工程

    gvite的主程序入口非常清爽,我们想了解整个vite工程庞大的脉络从入口这里进入是最好的开始。Main函数代码第一句就是显示一下版本号,这句可以忽略,我们把断点打在gvite_plugins.Loading()这句上。

    // gvite is the official command-line client for Vite
     
     func main() {
        govite.PrintBuildVersion()
        gvite_plugins.Loading()
     }
    

    打断点很简单,只需要用鼠标在代码行数的位置点击一下,出现红点后就代表已经下断成功了。

    然后使用debug模式启动gvite。

    debug模式运行后会直接断在gvite_plugins.Loading()这里。接下来就是调试的4个基本运行方式了,分别对应快捷键是F8(步过)、F7(步入)、Shift+F8(步出)、Alt+F9(运行到此处)。

    由于这里是总入口,所以我们选择步入,看看程序会最先走到哪里。执行F7过后,程序走到了加载插件的函数中。

    func Loading() {
        if err := app.Run(os.Args); err != nil {
           fmt.Fprintln(os.Stderr, err)
           os.Exit(1)
        }
     }
    

    余下的工作就是反复的对我们感兴趣的模块和功能进行下断,运行,下断,运行,直到我们摸清楚了程序的运行逻辑。

    OK,今天就先介绍到这里,后续我会分享一些VITE源码的分析结果给大家,谢谢!


Log in to reply
 

Suggested Topics