Skip to content

远程开发

why

远程开发,指本地机器连接到远程机器,在远程机器上的开发环境进行开发、调试等操作。

在这个过程中,本地机器无须配置任何开发环境,仅充当编辑器。

为什么需要远程开发呢,有以下几个原因:

  1. 快速构建各语言、各版本的开发环境,即用即走。当使用 docker 容器作为远程机器时,可以快速地得到 Node.js/Go 等的开发环境。
  2. 模拟生产环境,避免开发和生产阶段程序行为差异。
  3. 数据隔离,让本地机器中的数据更加干净(完美主义负担😭)。
  4. 快速复制、恢复环境。虚拟机镜像可快速复制,容器可快速重建。

另一种远程开发的形式

  • 本地和远程各一套开发环境
  • 本地编码、调试
  • 远程运行服务

同步 2 个开发环境,使其一致以正常运行,这本身是一个负担。

其次是污染了本地机器,本地机器作为了开发环境,安装了一堆开发依赖。

how

远程开发,可分为这几个阶段:

  1. 创建远程机器:云主机、局域网等组网环境中的其他机器、容器(docker/podman/...)、虚拟机。
  2. 连接远程机器:vscode ssh 连接 ssh root@localhost -p 22、网页连接。
  3. 搭建远程开发环境:非容器需自行搭建开发环境,容器可快速基于对应语言的镜像 + 添加 ssh 和 vscode 依赖后快速搭建。
  4. 在远程机器上开发调试:vscode 等,带端口转发功能,启动的服务可在本机调试。
  5. 代码管理:远程机器管理、本地机器管理
  6. 构建部署

如果是采用“容器”远程开发,在代码管理阶段会遇到一些问题:

  1. 文件归属权限问题:项目目录以卷的形式挂载到容器中,容器中的 root 等用户创建文件后,本地再修改文件需要 root 权限。如远程安装项目依赖,本地若也有开发环境,vscode 打开后插件可能无法正常读取依赖,不能正常进行代码提示等工作,这也是文件权限问题会导致的。
  2. 远程 Git 管理:远程若配置 git,需在构建镜像时添加 git 用户信息和 ssh 公钥,否则每次重新打开远程容器后,提交代码都需要添加用户信息,推送代码时都要配置 ssh 公钥。
  3. 本地 Git 管理:远程无 git,本地有 git,本地管理用户信息和 ssh 公钥。此时,vscode ssh 远程开发时,代码托管不可用,还得再打开一个 vscode 窗口打开本地项目进行代码管理。
  4. 项目依赖要持久化到本地,同样污染本地机器数据。
  5. vscode 远程依赖要持久化到本地,否则每次连接都要下载 vscode 远程依赖。

若是采用“虚拟机”远程开发,配置开发环境与主机一样麻烦外,且虚拟机 + 远程开发必然带来性能折损。但使用 nvm/gvm/uv 等对应开发语言的版本管理工具,能快速创建并切换环境。同时虚拟机本身可以快速复制快速在其他地方使用,虽然若硬盘读写慢复制可能需要很久。

若是采用云主机、组网环境机器等,和虚拟机类似,但少了快速复制恢复的能力(或需要复杂方式才能实现)。

what

综上,各种远程开发方式同样没有银弹。

  • 追求代码托管便捷:选择虚拟机、云主机、组网环境机器,或本地机器(不要远程)。
  • 追求不用配置开发环境:选择容器。但容器添加 ssh 必然涉及定制镜像,导致耗时。vscode 远程依赖持久化、项目安装依赖持久化也需费神。容器更适合拿来运行服务、验证容器中某工具的能力,而非开发。
  • 追求模拟生产环境:都可以
  • 追求快速复制、恢复:选择容器或虚拟机。云主机、组网环境机器、本地机器可配合快照实现。
访问量 PV:Blocked用户数 UV:Blocked