使用 VS Code 进行远程开发
2019 年 5 月 2 日,作者:The VS Code Team,@code
总结
今天,我们很高兴地宣布预览 Visual Studio Code 的三个新扩展,它们支持在 容器 中、在物理机或虚拟机上远程进行无缝开发,以及使用 适用于 Linux 的 Windows 子系统 (WSL) 进行开发。您可以通过安装 远程开发扩展包 立即开始。
注意:目前您需要使用 Insiders 版本,但远程开发支持最终将在稳定版中提供。
请继续阅读以了解我们的发展历程。
开发趋势
随着 VS Code 的普及,我们有幸并有机会与越来越多拥有不同开发环境的用户交谈,其中许多环境与我们自己的环境大不相同,以期找出推动 VS Code 前进以解决开发人员实际痛点的方法。
在这些交谈中出现了一个有趣的模式。我们看到许多开发人员试图使用 VS Code 来针对配置了特定开发和运行时堆栈的容器和远程虚拟机进行开发,仅仅因为在本地设置这些开发环境太困难、太具破坏性,在某些情况下甚至是不可能的。
我们都经历过这个问题。除非我们觉得是时候重置那台机器了 :), 否则我们都不敢尝试新的堆栈,如 Rust、Go、Node 或 Python3,因为害怕“弄乱”我们当前经过良好调整的环境。
Python 开发人员想切换到 VS Code,但不能,因为他们需要使用 容器和虚拟机 作为配置了特定 Python 堆栈的开发环境。
由于代码库非常庞大,我们看到 Facebook(和 Microsoft!)等公司的工程师使用 vim 等编辑器远程处理安全强大的“开发人员虚拟机”,使用替代的基于云的搜索和导航服务,这些服务的规模超出了即使是最好的笔记本电脑所能处理的范围。
构建和训练数据模型的“数据科学家”通常需要大量的存储和计算服务来分析无法存储或处理的大型数据集,即使是在强大的台式机上。
适用于 Linux 的 Windows 子系统 (WSL) 的普及在一定程度上得益于它易于设置一个隔离的开发环境,包括目标操作系统。事实上,VS Code 存储库中评论最多的第三个问题就是支持在 Windows 上的 Linux 发行版中从 Bash 终端运行 code。
当前解决方案的挑战
在所有这些交谈中,我们也一直听到开发人员在使用此类开发时面临的相同挑战。
-
远程桌面可行,但在某些 Linux 发行版上设置起来很困难或不可能,并且开发体验可能会“延迟”。
-
SSH 和 Vim(或带有文件同步的本地工具)可行,但它们可能很慢、容易出错,并且通常缺乏现代开发工具的生产力。
-
基于浏览器的工具在各种场景中都很有用,但开发人员不想放弃桌面工具提供的丰富性和熟悉性,也不想放弃他们现有的本地安装的工具链。
更糟糕的是(在我们看来!),开发人员必须牺牲核心 VS Code 体验,如 IntelliSense(代码完成)、代码分析和调试,才能针对这些环境进行工作。
不同的方法
在了解了这些挑战后,我们开始研究 WSL 支持,它看起来足够简单。安装 VS Code 并(当时要小心地!)像平常一样编辑 Windows 文件系统。我们做了工作来启用 Node.js 的远程调试,我们认为我们可以简单地安装一个小的脚本,以启用从 bash shell 启动 code。
但是,这根本不对。像我们为 Node.js 调试所做的那样,为每个运行时做特殊工作是没有意义的。如果你在 Windows 上安装了 Python 2.7 和 Flask(或者根本没有!),而在 Linux 发行版中安装了 Python 3.7 和 Django,你将无法获得正确的代码完成或代码分析,因为 VS Code 正在查看所有内容的 Windows 版本。不得不在 Windows 和 Linux 上复制开发环境完全违背了拥有 WSL 的目的。
我们说服自己,我们需要一种方法可以同时在两个地方运行 VS Code,即在本地运行开发人员工具,并连接到远程(例如容器或 VM)上下文中运行的一组开发服务。这使您可以在远程环境的上下文中获得丰富的本地开发体验。

推出 VS Code 远程扩展
在过去的几个月里,我们一直在努力重新建立代码层之间的适当边界,并消除对本地开发环境的假设。我们构建了三个新的扩展,用于处理在 WSL、Docker 容器中或通过 SSH 在物理机和虚拟机中运行的远程工作区。

WSL 扩展允许您直接从 VS Code 使用 适用于 Linux 的 Windows 子系统 (WSL) 作为完整的开发环境。这种新的、优化的支持允许您
- 使用 Windows 在基于 Linux 的环境(使用特定于平台的工具链和实用程序)中进行开发。
- 编辑位于 WSL 或挂载的 Windows 文件系统(例如
/mnt/c)中的文件。 - 在 Windows 上运行和调试基于 Linux 的应用程序。
命令和扩展直接在 Linux 发行版中运行,因此您不必担心路径问题、二进制兼容性或其他跨操作系统挑战。您可以在 WSL 中使用 VS Code,就像从 Windows 中使用一样。
观看这个快速的 2 分钟视频,了解在 WSL 中进行开发有多么容易。
有关更多信息,请参阅在 WSL 中开发文档。
远程 - SSH 扩展允许您打开托管在任何具有正在运行的 SSH 服务器的远程机器、虚拟机或容器中的文件夹或工作区。通过 SSH 进行开发允许您
- 在比本地机器更大、更快或更专业的硬件上进行开发。
- 快速切换不同的远程开发环境,并安全地进行更新,而不用担心影响本地机器。
- 调试在别处运行的应用程序,例如客户站点或云中的应用程序。
例如,假设您正在处理一个深度学习项目。您通常需要一个重度依赖 GPU 的虚拟机(例如 Azure 数据科学虚拟机),配置了所有必要的工具和框架,以便使用大规模数据集训练模型。
您可以使用 Vim 通过 SSH 或 Jupyter Notebooks 编辑远程代码,但您放弃了本地开发工具的丰富性。相反,使用 远程 - SSH 扩展,您只需连接到虚拟机,安装必要的扩展(如 Python),然后您就可以利用 VS Code 的所有出色功能,如 IntelliSense(代码完成)、代码导航和调试,就好像您在本地工作一样。
观看这个快速的 2 分钟视频,了解通过 SSH 在虚拟机上进行开发有多么容易。
有关更多信息,请参阅使用 SSH 进行开发文档。
Dev Containers 扩展允许您使用 Docker 容器作为您的开发容器。容器是很好的开发环境,因为
- 您可以使用一致且易于再现的工具链进行开发,使用的操作系统与您部署到的操作系统相同。
- 容器是隔离的,这意味着您可以快速切换不同的开发环境而不会影响本地机器。
- 其他人可以轻松地为您的项目做出贡献,因为他们可以在一致的开发环境中轻松地进行开发、构建和测试。
可以使用 devcontainer.json 文件告诉 VS Code 如何配置开发容器,包括要使用的 Dockerfile、要打开的端口以及要在容器中安装的扩展。当 VS Code 在工作区中找到 devcontainer.json 时,它会自动构建(如果需要)镜像、启动容器并连接到它。您的文件会挂载到容器中,因此您可以打开文件并开始编辑,并获得完整的 IntelliSense(代码完成)、代码导航、调试等等。
观看这个快速的 2 分钟视频,了解开发容器的实际操作。
有关开发容器的更多信息,请参阅在容器内开发文档以及vscode-remote-try-* 存储库,其中包含您可以立即使用的示例。
管理扩展
进行远程开发时,VS Code 会尝试根据扩展公开的功能推断要在哪里安装扩展,是在本地还是远程。扩展分为以下两类之一
-
UI 扩展在本地安装。这些扩展仅自定义 UI 并且不访问工作区中的文件,这意味着它们可以完全在本地计算机上运行。由于它们是本地安装的,因此无论您正在处理哪个工作区,它们始终可供您使用。UI 扩展的示例包括主题、代码片段、语言语法和按键图。
-
工作区扩展在远程安装。它们访问工作区中的文件和文件夹进行编辑,以提供 IntelliSense(代码完成)、跳转到定义、调试等功能。这些扩展可能会自定义 UI。这些扩展在远程运行,以便它们可以完全访问远程主机的文件系统和工具。

大多数扩展都已更新并在远程环境中正常工作,但如果您遇到一些不起作用的扩展,请提交有关该扩展的问题。
扩展作者
如果您正在创建 VS Code 扩展,我们已经实现了新的、支持远程的扩展 API。例如,扩展作者不应使用 open 包加载浏览器窗口,而应使用 vscode.env.openExternal API,该 API 会在本地打开浏览器。同样,一个新的 clipboard 类,它会将内容放置在本地剪贴板上,正如预期的那样。
可以在更新的API 文档中找到更多详细信息,包括如何在远程环境中运行、测试和调试您的扩展。
开始使用
感谢您读到这里!
以下是开始使用 Visual Studio Code 远程开发的 3 个快速步骤
-
安装 Insiders 版本。在稳定版可用之前,您需要它来进行远程开发。Insiders 版本每天发布最新功能和错误修复。如果您担心稳定性,请不要担心!我们使用 Insiders 版本来开发 VS Code,如果出现任何问题(并请告知我们),它可以与稳定版并排安装。
-
获取 远程开发扩展包,它安装了对 WSL、SSH 和容器的支持,是开始使用的最简单方法。如果您不需要所有这些,可以卸载单个扩展。
-
阅读文档。尝试Dev Container 示例。如果您使用 Python 进行开发(很多人都这样做!),请查看 Dan Taylor 关于远程 Python 开发的博客文章。
最后,如果您遇到问题,请提交问题。有关常见问题的解答,请参阅我们的常见问题。
让我们知道你的想法!
编程愉快,
the @code 团队

