linbuxiao / gitblog

1 stars 0 forks source link

Remote Development Environment 配置方案 #12

Open linbuxiao opened 1 year ago

linbuxiao commented 1 year ago

虽然在生活里我并不擅长归纳,在编程时却时常纠结于此。 开发环境常常是混乱的,多个语言,多个版本,多套依赖,这很容易造成不可收拾的混乱 —— 尽管这往往是假象。 因为长期的开发工作让我们明白,没有真正的混乱,只有无可避免的复杂度。

另外对于开发环境而言,反复的去布置让人伤神。而我们天生倾向于避免重复进行复杂的操作。这个时候远程开发出现了。 远程开发将帮助你:

  1. 你不再需要重复布置开发环境了,在本地你唯一需要的是编辑器。
  2. 或许高性能的笔记本不再是首要需求。因为你的本地承担的只有 UI 渲染任务。
  3. 将所有乱糟糟的部分放在远端吧。就像把所有繁琐的逻辑放进 models 一样。

VS Code 还是 Jetbrains Gateway

首先考虑的是 Gateway。因为我太依赖 Goland 了。Goland 的语法提示,环境布置,单步调试。关于这门语言的一切编辑技巧,都已经和 Goland 绑定。

但 Gateway 确实不够成熟好用。它实在是太卡了。 开始我以为是延迟的问题,于是我购入了国内的服务器。但这仍然阻止不了它时不时的跳 ping。 后来我觉得是配置太低,于是根据推荐配置,性能加到 2 核 4 G。当然我还想加更多,预算阻止了我。 结果是这都没能解决问题。

我毅然决然回到 VS Code。 之所以用“回到”,是因为在我一年多的前端生涯中,VS Code 一直是我的主力选择。这么算来,使用时间比 J 家要长些。

VS Code Remote 太流畅了。相比 Gateway,它完全实现了类本地开发的体验。 也是因为这个,就算我们遇到了一些其他问题,还是只能选择它。因为这种体验就是你梦寐以求的 remote。

遇到的问题有:

  1. 单步调试你会觉得有些不习惯,在你 debug 前,你需要先 debug 你的 debug 配置文件:lanch.json。
  2. Go Version。在 Goland 中我们只需要在配置中进行调整,它会帮助你切换依赖,以及注入 shell。但 VS Code 中你会遭遇小小的挫折。
  3. 语法提示。总是没那么好用。
  4. 引用跳转。在项目变得巨大时,它会遗漏一些。这会在你重构项目时阻碍你。

第一点需要适应,第二点可以改变,具体方法在下文我会提到,其余两点还是自求多福。 总而言之,我选择 VS Code。

网络环境

在开发时,很多依赖以及文件的安装下载都需要一个“合适”的网络环境。虽然说类似于 Golang 提供了 Proxy 的配置,但首先面临的问题是:怎么把 Go 下载下来。因为国内的下载实在是太卡了。

这里我的方案是 Clash + ProxyChains。

首先下载 Clash,选择的版本是 clash-linux-amd64。 下载与配置可以参考这篇文章:https://einverne.github.io/post/2021/03/linux-use-clash.html 我选择的进程守护方案是 pm2。因为相对来说熟悉一些。

  1. 从你的商家获取 clash 订阅地址,并用 wget 下载到 ~/.config/clash 下。
  2. 使用 pm2 start "clash -f <你的配置文件>" 启动即可。
  3. 查看 log: pm2 log <pid>
  4. 查看 状态: pm2 list

ProxyChains 的意义是:虽然你起了 clash,但是类似于 ping 等命令并不知道这件事。clash 只提供了端口接收流量并转发流量。你还需要一位指路人:让需要处理的流量去向 clash 的端口。ProxyChains 就是指路人。

简单配置也可以通过这位大大的另一篇文章看到:https://einverne.github.io/post/2017/02/terminal-sock5-proxy.html

对于尊重环境变量的大部分程序,可以通过设置全局代理来解决。zsh 可以这样设置:

# where proxy
proxy () {
  export http_proxy="http://127.0.0.1:7890"
  export https_proxy="http://127.0.0.1:7890"
  echo "HTTP Proxy on"
}

# where noproxy
noproxy () {
  unset http_proxy
  unset https_proxy
  echo "HTTP Proxy off"
}

在需要时直接 proxy 即可。

大部分情况下建议使用全局代理,proxychains 总是会出一些奇怪的问题。 另外,建议把内网 clash 规则前置,避免被其它规则覆盖。

内网开发

在开发过程中,有些中间件会走内网流量。如数据库,Redis 这些。甚至于我们的一些依赖也需要通过内网下载。 在使用 Mac 时,我使用 SSH Tunnel 建立内网通道,使用 Proxier 捕获指向内网的流量,并引路到SSH Tunnel 中去。 在 Linux 下的实现方案也基本一致。 区别是:

  1. ssh -N -D 8080 username@xxxx.gateway.com.cn 来替代 SSH Tunnel。
    • -D 表示打开 proxy,-N 表示连接后不执行命令
    • 仍然可以配置 zsh alias 让它更好用:alias xxx-ssh="ssh -N -D 8080 username@xxxx.gateway.com.cn"
  2. 用 clash 替代 Proxier。

在我们需要内网时,可以用 ProxyChains 将流量导向 clash,clash 通过规则将这部分导向 tunnel,这样打通。

VS Code 配置

{
    "http.proxySupport": "on",
    "go.logging.level": "error",
    "[go]": {
        "editor.insertSpaces": false,
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true
        },
        "editor.suggest.snippetsPreventQuickSuggestions": false
    },
    "workbench.colorTheme": "Monokai",
    "go.alternateTools": {
        "dlv": "dlv",
        "go": "/root/.goenv/versions/1.18.0/bin/go" # 手动设置路径
    },
    "security.workspace.trust.untrustedFiles": "newWindow",
    "editor.fontFamily": "Sarasa Mono SC, Menlo, Monaco, 'Courier New', monospace",
    "go.toolsManagement.autoUpdate": true,
    "editor.bracketPairColorization.enabled": true,
    "editor.guides.bracketPairs": "active",
    "workbench.iconTheme": "material-icon-theme",
    "editor.fontSize": 13,
    "editor.unicodeHighlight.nonBasicASCII": false,
    "terminal.integrated.defaultProfile.linux": "zsh" # 设置默认终端
}

Tip

众所周知关于 Go 的设置很多,但个人建议在能用起来的前提下,尽量少的去设置。 因为多个设置之间的关系可能是相互覆盖的:网上很多的长篇配置方案,其实有很多设置都无效化了。

Go Version

这边列出几个目前主流方案作为参考。

The Official

官方给出的方案是很明了的,先下一个主版本,再通过 go install 安装其他版本。 使用时通过 go1.18 这样的方式去运行。 这种方案最大的问题是无法控制 GOPATH,但是我是 MOD 重度依赖者。这点可以接受。 另一点就是不够直观,go1.18 和 go 还是有区别的。 另外可能还有其他坑,欢迎深度使用过的大佬进行补充。

GVM

很老牌的版本管理工具,解决了以上的问题。个人觉得唯一的缺点是很久没维护了(20年至今)。 使用时有几点需要注意:

  1. 不要着急去 INSTALL,文档往下翻,把预装环境先放置好。
  2. 你需要有一个先行版本才能安装高等级版本。
  3. 希望此时你已经配置好了网络,如果没有的话可以通过 GO_BINARY_BASE_URL 来更改源地址。

Goenv

较年轻的版本管理工具,据作者所说的有很多优势,个人觉得缺点有以下几点:

  1. 你需要配置很多变量,看安装指导就能发现。
  2. VS Code 会有几率无法识别你安装的包,暂不清楚是不是其他配置原因。 有时间可以尝试提供个脚本给官方去简化配置逻辑。

g

国人开发的工具,对国内安装做出了很多兼容。

  1. 使用方便,使用说明很友好。
  2. 持续维护