使用VS Code进行远程开发

2019年5月2日,由VS Code团队发布,@code

太长不看

今天我们很高兴地宣布,Visual Studio Code 的三个新扩展的预览版已经发布,这些扩展使得在容器中、在物理或虚拟机上远程开发,以及使用Windows Subsystem for Linux (WSL)进行无缝开发成为可能。你可以通过安装远程开发扩展包立即开始使用。

注意: 目前您需要使用 Insiders 版本,但远程开发支持最终将在稳定版本中提供。

继续阅读以了解我们是如何走到这一步的。

随着VS Code的日益流行,我们有幸有机会与越来越多拥有不同开发环境的用户交流,许多环境与我们自己的大不相同,以尝试找出我们可以推动VS Code前进的方法,解决开发者的实际痛点。

在这些对话中出现了一个有趣的模式。我们看到许多开发者尝试使用VS Code来针对配置了特定开发和运行时堆栈的容器和远程虚拟机进行开发,仅仅是因为在本地设置这些开发环境太难、太具破坏性,在某些情况下甚至是不可能的。

我们都经历过这个问题。除非我们觉得是时候彻底清理那台机器了 :),否则我们会犹豫是否尝试像 Rust、Go、Node 或 Python3 这样的新技术栈,担心会“搞乱”我们当前已经调优好的环境。

Python开发者希望切换到VS Code,但无法实现,因为他们需要使用容器和虚拟机作为为特定Python堆栈配置的开发环境。

Vagrant Box 推荐

由于代码库非常庞大,我们看到像Facebook(和微软!)这样的公司的工程师使用像vim这样的编辑器来远程工作,连接到安全且强大的“开发者虚拟机”,并使用替代的基于云的搜索和导航服务,这些服务的扩展能力甚至超过了最好的笔记本电脑所能处理的范围。

数据科学家在构建和训练数据模型时,通常需要大量的存储和计算服务来分析无法在强大的桌面上存储或处理的大型数据集。

Windows Subsystem for Linux (WSL)的流行度上升,部分原因是因为它使得设置一个包含目标操作系统的开发环境变得容易。事实上,VS Code仓库中评论第三多的问题是支持在Windows上的Linux发行版中从Bash终端运行code

VS Code 在 Windows 上的 Ubuntu 推荐

当前解决方案的挑战

在这些对话中,我们也不断听到开发人员在这种类型的开发中面临的相同挑战。

  • 远程桌面可以工作,但在某些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,你将无法获得正确的补全或linting,因为VS Code正在查看所有内容的Windows版本。必须在Windows和Linux上复制开发环境,这完全违背了拥有WSL的目的。

我们确信我们需要的是能够在两个地方同时运行VS Code的方法,以便在本地运行开发者工具并连接到在物理或虚拟机(例如,容器或虚拟机)环境中远程运行的一组开发服务。这使您能够在远程环境的背景下获得丰富的本地开发体验。

Visual Studio Code 连接到远程环境

介绍 VS Code 远程扩展

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

Visual Studio Code 远程扩展适用于 WSL、容器和 SSH

WSL 扩展允许您使用 Windows Subsystem for Linux (WSL) 作为完整的开发环境,直接在 VS Code 中使用。这种新的、优化的支持让您可以:

  • 使用Windows在基于Linux的环境中开发,使用特定平台的工具链和实用程序。
  • 编辑位于WSL或挂载的Windows文件系统中的文件(例如 /mnt/c)。
  • 在Windows上运行和调试基于Linux的应用程序。

命令和扩展直接在Linux发行版中运行,因此您不必担心路径问题、二进制兼容性或其他跨操作系统的挑战。您可以在WSL中使用VS Code,就像在Windows中使用一样。

观看这个快速的2分钟视频,了解在WSL中开发是多么容易。

欲了解更多信息,请参阅在WSL中开发文档。


Remote - SSH 扩展允许你在任何远程机器、虚拟机或容器上打开文件夹或工作区,只要该机器运行着SSH服务器。通过SSH进行开发可以让你:

  • 在比本地机器更大、更快或更专业的硬件上进行开发。
  • 快速在不同的远程开发环境之间切换,并安全地进行更新,而不用担心影响本地机器。
  • 调试在其他地方运行的应用程序,例如客户站点或云端。

例如,假设您正在处理一个深度学习项目。您通常需要一个GPU密集型的虚拟机(例如Azure 数据科学虚拟机),配置了所有您需要的工具和框架,以便使用大规模数据集训练您的模型。

你可以通过SSH使用Vim或Jupyter Notebooks来编辑远程代码,但这样你就放弃了本地开发工具的丰富功能。相反,使用Remote - 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扩展的示例包括主题、代码片段、语言语法和键映射。

  • 工作区扩展是远程安装的。它们访问工作区中的文件和文件夹进行编辑,以提供智能感知(补全)、转到定义、调试等功能。这些扩展可能会自定义用户界面。这些扩展在远程运行,以便它们可以完全访问远程主机上的文件系统和工具。

远程和本地扩展

大多数扩展已经更新并在远程环境中正常工作,但如果您遇到一些无法正常工作的扩展,请在扩展上提交问题。

扩展作者

如果您正在创建VS Code扩展,我们已经实现了新的远程感知扩展API。例如,扩展作者应使用vscode.env.openExternal API来加载浏览器窗口,而不是使用open包,这将在本地打开浏览器。同样,有一个新的clipboard类,它将内容放置在本地剪贴板上,如预期的那样。

更多详细信息可以在更新的API 文档中找到,包括如何在远程环境中运行、测试和调试您的扩展。

开始使用

感谢您阅读到这里!

以下是开始使用Visual Studio Code远程开发的3个快速步骤:

  1. 安装Insiders版本。在远程开发功能稳定版发布之前,您需要这个版本。Insiders版本每天都会发布,包含最新的功能和错误修复。如果您担心稳定性问题,不用担心!我们使用Insiders版本来开发VS Code,并且它可以与稳定版并行安装,以防万一出现问题(并告诉我们)。

  2. 获取Remote Development Extension Pack,它安装了对WSL、SSH和容器的支持,是入门的最简单方式。如果您不需要所有这些功能,可以卸载单个扩展。

  3. 阅读文档。尝试开发容器示例。如果你使用Python进行开发(很多人都是这样!),查看Dan Taylor的关于远程Python开发的博客文章

最后,如果您遇到问题,请提交问题。有关常见问题的答案,请参阅我们的常见问题解答

让我们知道您的想法!

编码愉快,

@code 团队