一直使用vscode写代码,也时常觉得vscode的设计挺符合微软的地位。简洁的界面,良好快捷方式,丰富的扩展是我使用vscode的原因。
vscode基于三个产品构建:Chromium 、 Electron 、Monaco-editor。
主要用TypeScript开发。
贴一下项目地址:
https://github.com/Microsoft/vscode/
另外,也经常有人拿vscode与JetBrains家的IDEA、Gland对比,要证明哪个好用。其实没有什么必要,用的顺手就行了。各有各自的特点,没有必要捧高踩低。
言归正传,最近发现了vscode的两个好用的功能——远程开发代码还有远程调试进程。
首先是远程开发代码的。
一般在服务端开发代码都是Linux
命令行环境,比较常用的开发工具是Vim
。但是,不熟悉Vim
的人用起来不方便,比如我习惯了vscode
的快捷方式与相应的扩展,转到Vim上就需要转换一下,效率比较低。
有没有一种方式,可以让我在服务端的环境中,也使用vscode开发?
或曰: 你本地开发完再放到服务端不就行了吗
当然不是,这个可以借助一个vscode插件完成——Remote - SSH
插件地址:
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh
Remote - SSH
可以让我们本地的vscode通过ssh
连接远端的服务器,然后,可以在对应文件夹中开发代码(用的是本地的vscode界面)
另外,Remote - SSH
还有另外两个兄弟:Remote - WSL
以及 Remote - Containers
。故名思意,通过名字可以知道另外两个是连接什么的。
我们可以看一下怎么使用Remote - SSH。
Remote - SSH
插件ssh 账户名称@IP
,然后就一路回车,中间需要你输入账户的密码。另外
使用Remote - SSH
连接上远端之后,可以运行代码,可以调试。我写了一个http服务测试了一下,在本地确实可以访问。
所以,可以直接在vscode上调试代码。
这样,通过Remote插件,就可以用本地的vscode连接远端服务器开发了。直接保留了开发习惯。
vscode这个功能确实好用,不得不赞叹开源的强大。
如果一定要在Linux上开发Go程序,vscode这样确实挺麻烦的,有的地方并不允许你远程连接。
这里推荐Linux下开发Go好用的IDE: spaceVim
文档:
https://spacevim.org/cn/documentation/
至于怎么安装,可以看我的另外一篇文章,Centos下直接使用shell脚本安装就可以了。
Centos下开发Go程序的环境安装
上面介绍了Remote-SSH
远程连接,在实际应用上面,还可以使用**Vscode
+ Remote-SSH
看 Linux
源代码 ( 不会卡顿的那种 )。
具体应用可以看下面这篇文章:
https://mp.weixin.qq.com/s/pNdiDyAAOvMh7KfvNNj1Mg
但是,
万一,你并没有服务端相应的权限呢。。。
万一,你是开发维护一个守护进程呢。
这样好像就有点棘手了。
下面就介绍使用本地vscode
调试远端程序(或者进程),这个需要借助Go 的调试工具dlv
完成。
dlv
的权限。vscode
(并没有要求Remote-SSH
插件)vscode
上,保留有与远端程序版本一致的代码。(代码版本要一致,远端可以没有这个代码——只要有进程)具体怎么远程调试呢?
这里的原理我先说一下,核心就是利用dlv工具,使用dlv起一个dap server 服务,监听一个端口。而本地的vscode通过配置调试,连接这个端口,使用DAP协议通信和远端通信,进行远程attach调试。
启动程序,得到进程号,假设是204031
开启dlv dap
服务,并dlv attach
到对应的进程上,随后启动dap server
dlv --headless -l 0.0.0.0:204031 attach 214155--api-version 2
#7488为进程号
#dlv在哪个目录执行都可以
#注意声明 --api-version 2
配置本地的调试文件——launch.json
进入调试窗口,创建launch.json
文件,针对Go语言的有package、file、Connect to server
三个选项。
选择connect to server
之后,将配置信息补充完整:
"configurations": [
{
"name": "Connect to server",
"type": "go",
"request": "attach",
"mode": "remote",
// 注意!!非常关键,这是能否成功设置断点的关键参数。
"remotePath": "{编译的项目路径}",
// dlv server 启动的端口
"port": 2345,
// 远程主机的 IP
"host": "192.168.xx.xx"
}
]
例如:
remotePath
这个参数非常关键,是你能否远程设置断点成功的关键。它不是进程当前的目录,也不是本地项目的代码目录,而是编译二进制项目的目录。
运行调试
服务端启动,客户端配置好之后。就可以在本地代码上设置断点,然后启动调试,就能够在本地vscode上看到调试信息。这样就可以实现远程调试。
再次赞叹一下vscode的方便以及开源社区的强大,从容器之争的过程就能够看到开源社区强大的力量,所以,我觉得后面vscode会有更多好用的功能。如果还有好用的插件推荐,欢迎在评论区分享 。
关于远程调试的应用的,可以通过vscode调试容器里的应用。
# 基础镜像
FROM golang:latest
# 下载dlv工具
RUN GOPROXY=https://goproxy.cn go get github.com/go-delve/delve/cmd/dlv
# 创建工作目录
RUN mkdir -p /go/src/app
WORKDIR /go/src/app
# 拷贝主机当前文件到工作目录
COPY . /go/src/app
# RUN go build -gcflags "all=-N -l"
# CMD ["dlv", "debug", "--headless", "--listen=:2345", "--log", "--api-version=2" ]
# 默认执行命令
CMD ["dlv", "debug", "--headless", "--listen=:2345", "--log", "--api-version=2"]
然后docker build -t app .
2. 配置launch.json文件
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch remote",
"type": "go",
"request": "launch",
"mode": "remote", // 开启远程模式
"remotePath": "/go/src/app", // 远端main文件所在目录,必须是绝对路径
"port": 2345, // dlv服务的暴露端口号
"host": "192.168.0.250", // dlv服务的ip即docker容器所在主机的ip
"program": "${workspaceRoot}",// 本地main文件所在的目录
"env": {}
}
]
}
docker run --rm --name webapp --security-opt="seccomp=unconfined" -cap-add=SYS_PTRACE -p 2345:2345 app
总结一下,今天介绍了使用本地vscode远程开发还有远程调试的方法。
Remote-SSH
插件连接远端,完成开发与调试。dlv
,远程启动dap
服务,然后本地vscode
调试环境连接这个服务,就可以在本地代码打断点调试了。需要注意,代码版本要一致。并且,远端可以只是进程没有代码,本地一定要有代码。go调试【翻译】 https://juejin.cn/post/6844904087763304462
用vscode调试 https://juejin.cn/post/7080135520902184997
调试docker里的go https://juejin.cn/post/6844904165517312013
程序是调出来的 https://www.modb.pro/db/377704
dlv介绍 https://www.likecs.com/show-133461.html
dlv使用 https://www.jianshu.com/p/4f3c2e913915