Go进阶36:Goland远程开发调试
我们团队大部分的人都是使用mac开发, 而我比较持家舍不得花大价钱来更新换代我5年前买的macbook, 所以我长期使用公司配备的Window10进行日常的开发. 在之前的99%的情况下我的windows10都可以满足安装各种环境(ruby/jekyll,python,php,java). 直到有一个同事在项目中添加confluent-kafka-go来使用消息队列, 发现confluent-kafka-go依赖的是c++, 同时还依赖一个可执行文件,这个可执行文件只支持mac/linux windows10不支持. 更糟糕的是, 我之前觉得windows10子系统用的少, 我也把我的ubuntu子系统删掉了, 同时把hyper-V卸载了, 现在在安装ubuntu子系统就会报错.
难道我要放弃在windows10开发这个golang项目吗? 程序员绝不说不
解决方案就是:
- Golang->SFTP 自动同步代码到linux开发服务器(SMBA也可以)
- linux 服务器: go build -> dvl 开启远程调式服务
- Goland 连接dvl 服务地址
1. 远程调试Debug优点
- 极大的加快开发速度,减少给在代码中使用大量log来定位错误.
- 最大程度的使用linux远程服务器环境, 极大的简化本地部署模拟服务器环境
- 可以绕过数据库内网的限制
- 不用依赖日志来定位错误(开发效率太低)
- 完美的解决一些不支持windows开发的依赖
2. Go远程调试Debug
2.1 linux 安装Golang环境
#https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
VERSION='1.13.4';#设置go语言版本 指定您的版本
OS=linux # 可选值 linux darwin
ARCH=amd64 #可选值 但是必须与您的操作系统匹配 amd64, 386, arm (树莓派raspberryPi3), arm64, s390x, ppc64le
GZFILE="go$VERSION.$OS-$ARCH.tar.gz" # 下载的安装名称包含arch
wget "https://dl.google.com/go/${GZFILE}";
rm -rf /usr/local/go; # 删除旧的go安装文件
tar -C /usr/local -xzf $GZFILE; #解压文件到 /usr/local/go目录中
在您是linux的 vim 环境变量文件(~/.bashrc /etc/profile)最后添加一下3行代码:
export GOPATH=/opt/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
重新加载环境变量文件: mkdir -p $GOBIN;
创建目录
source /etc/profile
or source ~/.bashrc
2.2 linux服务器安装Delve
git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve
cd $GOPATH/src/github.com/go-delve/delve
make install
# dlv 在您的$GOBI目录
ls $GOBIN
dlv # 不报错证明安装好了
2.2 Goland SFTP 自动同步代码(SMBA也可以)
如果找不到SFTP,请安装SFTP Plugin, Goland 添加SFTP: Goland菜单: Tools -> Deployment -> Configuration 加号
Goland SFTP 本地代码目录映射
勾选自动上传Goland菜单: Tools -> Deployment -> Auto Upload(Always)
2.3 服务器开启Delve 服务
cd ~/go_project; # golang 代码目录
go build -o app.exe; # 编译golang代码
dlv --listen=:2345 --headless=true --api-version=2 exec ~/go_project/app.exe api; # 开启delve服务 其中 api 是golang程序的参数
建议把上面的命令自定为linux 当前用户的profile文件的alias
参考我的 ~/.bashrc
文件, 我定义了一个 debugm 命令来调试go代码.
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export GOBIN=/gobin;
export PATH=$PATH:/usr/local/go/bin:$GOBIN;
export GOPROXY=https://goproxy.io
export GO111MODULE=on
alias debugm="cd ~/go_project; go build -o app.exe; dlv --listen=:2345 --headless=true --api-version=2 exec ~/go_project/app.exe api"
2.4 Goland Debug 配置
填写linux 服务的ip 和 delve的端口,自己设置防火墙.
2.5 Goland打断点
每次代码更新的适合需要在linux中 ctrl+c, 在执行debugm(自定义命令) linux 服务器中:
[eric@mojotv.cn ~]$ cat ~/.bashrc #查看当前用户的profile 配置
[eric@mojotv.cn ~]$ debugm # 执行自定义的命令
API server listening at: [::]:2345
在Goland中点击debug按钮
[mojotv.cn@p28537v yzt]$ debugm
API server listening at: [::]:2345
# Golang 点击虫子按钮之后打印出来的
2019/11/27 19:09:29 访问 http://127.0.0.1:9527/swagger-doc for RESTful APIs Swagger 文档
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /swagger-doc/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD /swagger-doc/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
INFO[0000] start asset sync runner...
[GIN-debug] GET /screen-shot/assets/:id --> marvel/handler.AssetScreenShot (4 handlers)
[GIN-debug] GET /api/v1/admin-division --> marvel/handler.AdminDivision (4 handlers)
...
[GIN-debug] Listening and serving HTTP on 0.0.0.0:9527
Goland断点效果