Vs Code学习-搭建Golang开发环境

目录

1.搭建需求

因项目需要去了解go语言,于是想自己学一些基本的go语言知识,搭建开发环境是第一步,搭建过程中碰到一些坑做一些记录,vscode部署在windows 10本机上,现在要求达到下面两种效果

  1. 能够执行本机go代码并调试(适用于windows本地开发,本地运行本地调试)
  2. 能够远程执行go代码并调试(适用于linux远程开发,具体就是本地远程各有一份源代码,通过本地的vscode可以直接运行调试)

2.本地搭建

2.1.go下载

go下载
选择windows安装版本(msi后缀)

2.2.go环境变量设置

设置GOROOT以及GOPATH,msi版本默认将go安装在c盘,我的系统是win10的,GOPATH设置成D:\Go_work
03go2

2.3.vscode下载

vscode下载

2.4.配置go开发环境

安装go插件
04go3

安装go依赖包
这一步最为重要,一般在vscode新建文件进行代码编写会提示
04go4
点击install all下载安装依赖包
04go5

ctrl+`打开terminal会看到vscode正在下载依赖包,但往往因为墙的原因下载失败,可以多试几次是可以安装成功的

如果还是安装失败,可以把相关依赖包源码下载到GOPATH下,默认在GOPATH下我们需要创建三个目录src、pkg、bin,创建完了后,根据安装依赖安装错误提示来创建对应的目录 比如Installing github.com/sqs/goreturns FAILED ,在src下创建目录github.com\sqs,然后进入此目录拉取源码
git clone https://github.com/sqs/goreturns.git

还有一种依赖包比如Installing golang.org/x/tools/cmd/guru FAILED ,这种可以访问https://godoc.org/golang.org/x/tools/cmd/guru 到页面去下载,然后与上面一样创建路径,不过这种不一定能打开具体的页面,那么该如何办呢?

这种情况下我们先不管,先安装github.com下的相关依赖,ctrl+`进入终端,执行go install,还是会提示错误,一般是提示
04go6

一样的道理,现在src下的github.com下创建对应的目录,然后拉取依赖源码,一般首先会提示缺少依赖工具golang.org/x/tools/imports 或者别的某个包(这里是imports)

比如下载tools的源码
git clone https://github.com/golang/tools.git
将此源码放在src\goalng.org\x下,再次执行go install这样就能把可以装的依赖都装上,以上过程重复试用总能把所有依赖安装完成的

debug配置
写一个hello world后发现运行的时候无法DUBUG,这里还需要配置一下,当运行程序的时候会有提示让创建launch.json
cat launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "LaunchGo",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "remotePath": "",
            "port": 5546,
            "host": "127.0.0.1",
            "program": "${fileDirname}",
            "env": {
                "GOPATH": "D:/Go_work",
                "GOROOT": "C:/Go"
            },
            "args": [],
            //"showLog": true
        }
    ]
}

除此之外还需要对vscode进行一个全局的配置,点击下图处
04go7
cat settings.json

{
    "editor.wordWrap": "on",
    "editor.minimap.renderCharacters": false,
    "editor.minimap.enabled": false,
    "terminal.external.osxExec": "iTerm.app",
    //"go.useLanguageServer": true,
    "go.docsTool": "gogetdoc",
    "go.testFlags": ["-v","-count=1"],
    "go.buildTags": "",
    "go.buildFlags": [],
    "go.lintFlags": [],
    "go.vetFlags": [],
    "go.coverOnSave": false,
    "go.useCodeSnippetsOnFunctionSuggest": false,
    "go.formatTool": "goreturns",
    "go.gocodeAutoBuild": false,
    "go.goroot": "C:\\Go",
    "go.gopath": "D:\\Go_work",
    "go.autocompleteUnimportedPackages": true,
    "go.formatOnSave": true,
    "window.zoomLevel": 0,
    "debug.console.fontSize": 16,
    "debug.console.lineHeight": 30,
    "[javascript]": {
        "editor.defaultFormatter": "HookyQR.beautify"
    },
    "[html]": {
        "editor.defaultFormatter": "HookyQR.beautify"
    },
}

这里报了个错,缺少依赖包gogetdoc
git clone https://github.com/zmb3/gogetdoc.git 下载源码,放置在目录src/github.com/zmb3下
go install github.com/zmb3/gogetdoc 进行安装

这样就既满足了debug的需求,同时也满足了迅速执行代码的需求

3.远程搭建

3.1.本机配置远程服务

有时候本地开发不那么方便,需要远程到目标服务器进行远程开发,vscode也能满足这个需求,但在安装go环境以及go插件的时候,需要先解决一个问题:如何连接到目标服务器,与ftp等文件传输协议的远程工具不同,vscode更像是一款可以远程连接到远程主机的终端,与许多远程终端工具一样利用ssh协议实现远程连接进而达到实时同步的效果

第一步:安装remote development

04ext1

第二步:配置远程服务器

  • 选择左边菜单栏的remote explorer
  • 选择SSH Targets
  • 选择齿轮,选择config文件

04config1

04sino

配置了两台远程主机

右击”private_repo“ 选择”connect to host in current window“
输入密码即可登录

3.2.配置免密登录

打开cmd
ssh-keygen
上传生成在C:\Users\user_name.ssh路径下的公钥id_rsa.pub到目标服务器的/root/.ssh/下,把刚上传的id_rsa.pub中的内容附到authorized_keys文件中,chmod -R 600 authorized_keys
.ssh的权限要设置为700

连接终端
04ssh3

打开目录
04ssh4
这里可以自由选择目标服务器/目录下的目录

登陆成功
04ssh5

3.3.本机部署dlv

git clone https://github.com/derekparker/delve
将delve包依照前面安装Go依赖包的方式安装
go install github.com/derekparker/delve/cmd/dlv
缺少什么包就安装什么包
vscode上ctrl + `进入终端,执行.\bin\dlv.exe查看版本

3.4.目标主机安装go

与在本地安装go编译环境和插件类似,只是环境变成了centos7,安装包变成tar.gz包了

tar zvxf go1.13.1.linux-amd64.tar.gz -C /usr/local/

设置环境变量
cat setup.sh

cat <<EOF>> /etc/profile   
export GOROOT=/usr/local/go
export GOPATH=/go   
export PATH=\$PATH:\$GOROOT/bin:\$GOPATH/bin 
EOF

3.5.目标主机部署dlv

部署和本机部署类似,将依赖包下载到$GOPATH/src/github.com/derekparker 下,注意路径,然后go install github.com/derekparker/delve/cmd/dlv 缺少什么包安装什么包
dlv version查看版本

3.6.添加debug方案

基于前面的debug方案,增加远程debug配置launch.json
特别强调,这个配置文件是在vscode连接的本地终端上进行的配置,不是远程终端

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "LaunchGo",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "remotePath": "",
            "port": 5546,
            "host": "127.0.0.1",
            "program": "${fileDirname}",
            "env": {
                "GOPATH": "D:/Go_work",
                "GOROOT": "C:/Go"
            },
            "args": [],
            //"showLog": true
        },
        {
            // 调试配置的名称,用作vscode中区分
            "name": "remotedebug",
            // 调试类型,go语言当然选择go
            "type": "go",
            // 调试请求类型,可以选择launch启动调试和attach附加调试
            "request": "launch",
            // 调试模式,这里选择远程调试
            "mode": "remote",
            // 必填项,远程调试里好像没什么用处
            "program": "${fileDirname}",
            // 远程连接的端口号
            "port": 2345,
            // 远程主机的ip地址
            "host": "47.101.166.64",
            // 被调试的代码在远程主机上的路径,必须使用绝对路径.且具体到指定调试目录
            "remotePath": "/go/src/linuxwt.com",
        }
    ]
}

到这里我们完成了远程调试的全部操作,下面进行具体的debug测试
远程服务器上源代码路径:$GOPATH/src/linuxwt.com/struct3.go
cat $GOPATH/src/linuxwt.com/struct3.go

package main

import "fmt"

var globalVar int

func main() {
	globalVar = 2
	localVar := 1
	globalVar++
	localVardlv的debug远程调试需要远端和近端都持有全部的源代码文件
	fmt.Printf("%v + %v = %v\n", globalVar, localVar, globalVar+localVar)
}

如果要调试该程序,需要分两步:
1、dlv的debug远程调试需要远端和近端都持有全部的源代码文件,将远端服务器上的源代码拷贝至本机的$GOPATH/src/linuxwt.com中
2、远端服务器上切换到代码目录,启动dlv服务端
cd $GOPATH/src/linuxwt.com
dlv debug --headless --listen ":2345" --log --api-version 2
输出以下内容表示启动成功

API server listening at: [::]:2345
2020-04-15T23:53:24+08:00 info layer=debugger launching process with args: [/go/src/linuxwt.com/__debug_bin]

3、本机终端F5开始debug
04ssh6
正常运行完后,可以在远端的后台看到输出

3 + 2 = 5
2020-04-15T23:57:14+08:00 error layer=rpc rpc:read tcp 172.19.159.10:2345->171.42.153.187:10368: read: connection reset by peer

4、断点debug
F9设置断点,F5启动debug
04ssh7
远端debug日志输出

API server listening at: [::]:2345
2020-04-15T23:59:06+08:00 info layer=debugger launching process with args: [/go/src/linuxwt.com/__debug_bin]
2020-04-15T23:59:23+08:00 info layer=debugger created breakpoint: &api.Breakpoint{ID:1, Name:"", Addr:0x4af7da, Addrs:[]uint64{0x4af7da}, File:"/go/src/linuxwt.com/struct3.go", Line:9, FunctionName:"main.main", Cond:"", Tracepoint:false, TraceReturn:false, Goroutine:false, Stacktrace:0, Variables:[]string(nil), LoadArgs:(*api.LoadConfig)(0xc000500f60), LoadLocals:(*api.LoadConfig)(0xc000500f90), HitCount:map[string]uint64{}, TotalHitCount:0x0}
2020-04-15T23:59:23+08:00 debug layer=debugger continuing

注意,每次调试完后远端的dllv服务就会关闭,所以每次调试都需要重启dlv服务

图中的红点就是断点,表示在此行中断,即将要运行改行代码,可以通过右边的调试工具来自由运行

调试快捷键
F5 开始调试

shift + F5 停止调试

F9 设置/删除断点

F10 跳过

F11 跳入

shift + F11 跳出

4.快捷执行代码

前面主要是本地远程搭建配置debug的方法,而且只有本地搭建的部分通过安装官方Go插件实现了编写Go代码时具有提示、debug等功能,且debug后会返回结果,但这个返回过程是相对较慢,远程搭建部分通过部署dlv插件实现了本地远程调试代码的功能,但是这个调试在本地的vscode终端上是无法看到代码运行的结果的,只能在远端服务器dlv日志输出看到返回的结果,如果想要看到代码在vscode上返回的结果,则需要vscode远程连接到终端,然后安装code runner,本地远端终端都要安装此插件,同时如果需要远端服务器上进行开发也要有代码提示也需要在远端服务器上安装Go插件
打开代码,右键-run code就可以直接看到代码运行的结果了
04code

如果要在执行go代码使用code runner其实还需要配置一个settings文件,因为debug模式和go run模式是有区别的,code runner执行需要指明go run的路径
在目录/PATH/src/.vscode下创建文件
cat seetings.json

{
    "code-runner.executorMap": {
        "go": "cd $dir && go run .",
    },
    "code-runner.executorMapByGlob": {
        "$dir\\*.go": "go"
    }
}