571
社区成员
一、需求分析
VS Code是一款轻量级的跨平台代码编辑器,它本身的功能其实很简单,但是通过各种插件可以扩展出很多功能,满足各种用户的需求。Remote Development就是VS Code上的一款插件,它允许开发者将容器、远程计算机或 Windows Subsystem for Linux (WSL) 作为完整的开发环境。具体来说,该插件使得用户能够:
1、在部署相同的操作系统上进行开发,或者使用更大或更专业的硬件。
2、把开发环境作为沙箱,以避免影响本地计算机配置。
3、让新手轻松上手,让每个人都保持一致的开发环境。
4、使用原本在本地环境不可用的工具或运行时,或者管理它们的多个版本。
5、在 WSL 里开发 Linux 应用。
6、从多台不同的计算机访问现有的开发环境。
7、调试在其他位置(比如客户网站或云端)运行的应用程序。
所有以上的功能,并不需要在本地开发环境有源代码。通过 VS Code Remote Development,轻松连接上远程环境,在本地进行开发。
对上述功能进行需求分析:
功能性需求:
远程连接:用户在VS Code中连接到远程服务器,这样用户才能够使用远程服务器进行开发
文件传输:用户可以在本地和远程服务器之间进行下载或上传文件,以完成开发工作
调试代码:用户可以在远程服务器上调试代码
非功能性需求:
安全性:采用必要的措施保证远程连接的安全性,防止信息泄露
高可靠性:防止数据在传输过程中发生变化,导致数据传输失败或者传输了错误的数据
性能:用户在使用远程开发时应该感觉像在本地一样,因此远程服务器的响应速度要快。另外主要工作是在远程进行的,本地占用的资源要尽可能少
通过以上分析,我们可以得知VS Code Remote Development的主要功能和需求。我们进行远程开发时第一件事就是进行连接,我们首先需要将本地机器和远程服务器连接起来,进行相应的配置,这样才能够在远程服务器上工作,因此本文选取远程连接这一功能进行分析。
二、逆向工程
为了更好地理解 Remote Development 功能是如何实现的,我们可以进行逆向工程,即对代码库进行分析,以确定其实现细节。
在查看代码前,我们可以先了解 VS Code 的插件开发机制和插件架构。VS Code 使用 Electron 作为底层框架,并使用 TypeScript 进行开发。其中,插件可以访问 VS Code API 来扩展编辑器的功能。
接下来,我们可以阅读 Remote Development 插件的源代码并进行分析。Remote Development 插件包括客户端和服务器端两部分。客户端负责与用户交互,并将请求发送到远程服务器。服务器端则负责处理请求,并返回结果给客户端。
在客户端的实现中,我们可以看到 Remote Development 插件使用了 Visual Studio Code 中提供的 Terminal API 来创建终端窗口,通过 SSH 隧道将本地计算机的端口转发到远程计算机上,并使用 sshfs 和 rsync 等工具进行文件同步。此外,客户端还支持在远程服务器上进行远程调试。对于容器方式的连接,插件使用了 Docker API 来管理容器。
在服务器端的实现中,Remote Development 插件实现了一个名为 "vscode-remote-server" 的 Node.js 应用程序。该应用程序监听客户端发来的请求,并在收到请求后启动远程开发环境。同时,服务器端还支持通过 SSH 隧道将本地计算机的端口转发到远程计算机上。
通过逆向工程的分析,我们可以更深入地了解 Remote Development 功能的实现细节,并且在开发和调试过程中更加得心应手。
VS Code Remote Development 的实现方法可以从其 GitHub 上的源代码库中获得。该项目使用 TypeScript 和 Node.js 编写,下面是一些重要的类和函数:
remoteExplorer.ts
remoteExplorer.ts 提供了与远程资源管理器相关的类和函数。其中最重要的类是 RemoteFileService 和 RemoteFileSystemProvider,它们分别处理文件服务和文件系统提供程序的功能。
tunnelModel.ts
tunnelModel.ts 定义了一个名为 TunnelModel 的类,它处理 SSH 隧道的创建和关闭。该类依赖于 sshHelper.ts 中提供的 SSH 命令行帮助程序。
environmentService.ts
environmentService.ts 提供了用于获取和设置 VS Code 环境变量的方法。该模块还包含 DataprotocolServer 类,该类充当数据协议服务器并接受来自客户端的请求和响应。
extensionHostProcessManager.ts
extensionHostProcessManager.ts 管理远程扩展主机进程的生命周期。在用户打开远程文件夹时,该组件会运行并启动扩展插件进程,在本地 VS Code 编辑器中显示远程扩展插件。
terminalServer.ts
terminalServer.ts 实现了终端服务器,允许用户通过 SSH 连接到远程主机的终端。TerminalProcess 类管理 SSH 进程和 shell 进程。
remoteAgentConnection.ts
remoteAgentConnection.ts 定义了 RemoteAgentConnection 类,该类充当与远程 VS Code 编辑器的通信管道。它使用 MessagePipe 协议在本地计算机和远程主机之间传递信息。
作者:096