伴随着容器化、深度学习等技术的生产应用,越来越多的场景面临“远程”开发的问题,例如:
而这些远程环境很难甚至不可能在本地重建一份,比如:
.Net Framework 4.0 + MSSQL 2000
,并且各自安装了一堆特定版本补丁的历史项目,几乎无法还原其环境无论什么原因,总会面临本地与远程环境差异带来的各种不便
对于远程开发的场景,一般有 4 种解决方案:
能够解决一部分问题,但大多牺牲了本地开发环境的诸多便利
那么,有没有办法从本地环境无缝切入远程环境呢?既能享受本地熟悉的全套工具链带来的便利,同时还能进行远程开发呢?
当然有
从开发工具的角度来看,需要提供 3 方面的支持:
对于 Windows 下开发 Linux 的问题,Win 10 在 2016 年已经提供了Windows Subsystem for Linux (WSL),可以在 Windows 下直接(没错,不是虚拟机)运行一个 Linux 子系统:
WSL 提供了基本的文件共享支持,但开发工具(例如 VS Code)面临的情况要更复杂一些:
If you have Python 2.7 and Flask installed on Windows (or none at all!) and Python 3.7 and Django installed in the Linux distro, you wouldn’t get proper completions or linting because VS Code was looking at the Windows versions of everything.
开发工具需要明确区分不同环境,于是产生了一种很有意思的思路:
We convinced ourselves that what we needed was a way to run VS Code in two places at once, to run the developer tools locally and connect to a set of development services running remotely in the context of a physical or virtual machine (for example, a container or VM).
简言之,让一部分(环境无关的)插件运行在本地环境,另一些(环境相关的)插件运行在远程环境,比如容器、虚拟机、WSL、服务器等等……
如此这般,一切问题都解决了,在支持远程开发的同时兼顾了本地开发体验:
This gives you a rich local development experience in the context of what is in the remote environment.
VS Code 在 1.35 版本(2019/6/4)正式发布了 Remote Development 支持:
Remote Development (Preview) available in Stable – You can now use the Remote Development extensions in Stable.
并在最新 1.36 版本丰富了更多特性:
Remote Development (Preview) improvements – Save to local file system, drag and drop files to remotes, and more.
安装Remote Development插件包即可,目前(2019/7/6)插件包里提供了 3 个插件:
通过 SSH 通道连接远程机器、虚拟机或容器,继而访问其文件系统、管理终端、运行/调试应用,如下图:
具体的,基于 SSH 的远程开发支持让我们:
应用运行在远程,而开发调试都能在本地进行,继续享受熟悉的本地完备工具链带来的便利
P.S.关于 SSH 远程开发的更多细节,见:
更进一步地,容器支持允许将指定的 Docker 容器作为开发环境,进而:
实现上,结构与 WSL 支持完全一致:
P.S.关于 Docker 容器远程开发的更多细节,见:
通过 Remote – WSL 插件,可以将 WSL 用作整套开发环境,具体的,支持以下特性:
/mnt/c
)P.S.关于 WSL 远程开发的更多细节,见:
就目前而言,能够无缝切入远程环境的 IDE,似乎要比云 IDE 更实在一些:
Browser-based tools are useful in a variety of scenarios, but developers don’t want to give up the richness and familiarity that desktop tools provide, or their existing locally installed tool chains.