使用 VS Code 进行远程开发
2019 年 5 月 2 日,VS Code 团队,@code
TL;DR
今天,我们很高兴地宣布 Visual Studio Code 的三个新扩展的预览版,这些扩展支持在 容器 中、在物理或虚拟机上远程以及使用 适用于 Linux 的 Windows 子系统 (WSL) 进行无缝开发。您可以立即开始使用,方法是安装 Remote Development Extension Pack。
注意:您现在需要使用 Insiders 构建,但远程开发支持最终将在 Stable 版本中提供。
继续阅读以了解我们是如何走到这一步的。
开发趋势
随着 VS Code 的日益普及,我们有幸与越来越多的具有不同开发环境的用户进行交流,其中许多环境与我们自己的环境截然不同,以尝试找出我们可以推进 VS Code 以解决开发人员实际痛点的方法。
在这些对话中出现了一个有趣的模式。我们看到许多开发人员尝试使用 VS Code 对配置了特定开发和运行时堆栈的容器和远程 VM 进行开发,仅仅是因为设置这些本地开发环境太难、太麻烦,在某些情况下甚至是不可能的。
我们都经历过这个问题。除非我们觉得是时候清理那台机器了:),否则我们会犹豫是否尝试 Rust、Go、Node 或 Python3 等新堆栈,因为害怕“搞砸”我们当前精心调整的环境。
Python 开发人员想要切换到 VS Code,但无法切换,因为他们需要使用 容器和虚拟机 作为为特定 Python 堆栈配置的开发环境。
由于代码库非常庞大,我们看到像 Facebook(和 Microsoft!)这样的公司的工程师使用像 vim 这样的编辑器来远程处理安全且功能强大的“开发人员 VM”,使用替代的基于云的搜索和导航服务,这些服务可以扩展到甚至最好的笔记本电脑都无法处理的范围。
构建和训练数据模型的数据科学家通常需要大量的存储和计算服务来分析大型数据集,这些数据集甚至无法存储或处理在强大的台式机上。
适用于 Linux 的 Windows 子系统 (WSL) 的日益普及部分原因在于它使设置包含的开发环境(包括目标操作系统)变得容易。事实上,VS Code 存储库中评论最多的第三个问题是支持从 Windows 上的 Linux 发行版中的 Bash 终端运行 code
。
当前解决方案的挑战
在这些对话中,我们还不断听到开发人员在这种类型的开发中面临的相同挑战。
-
远程桌面可以工作,但它在某些 Linux 发行版上很难或不可能设置,并且开发体验可能会“滞后”。
-
SSH 和 Vim(或带有文件同步的本地工具)可以工作,但它们可能很慢、容易出错,并且通常缺乏现代开发工具的生产力。
-
基于浏览器的工具在各种场景中都很有用,但开发人员不想放弃桌面工具提供的丰富性和熟悉度,也不想放弃他们现有的本地安装的工具链。
更糟糕的是(我们认为!),开发人员不得不牺牲核心 VS Code 体验,例如 IntelliSense(补全)、linting 和调试,才能在这些环境中工作。
一种不同的方法
在听到这些挑战后,我们开始研究 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 的方法,即在本地运行开发人员工具,并连接到一组在物理或虚拟机(例如,容器或 VM)上下文中远程运行的开发服务。这使您可以在远程环境的上下文中获得丰富的本地开发体验。
介绍 VS Code 远程扩展
在过去的几个月中,我们一直在努力重新建立代码层之间的适当边界,并消除对本地开发环境的假设。我们构建了三个新的扩展,用于处理在 WSL、Docker 容器或通过 SSH 在物理和虚拟机中运行的远程工作区。
WSL 扩展使您可以直接从 VS Code 使用 适用于 Linux 的 Windows 子系统 (WSL) 作为完整的开发环境。这种新的、优化的支持使您可以
- 使用 Windows 在基于 Linux 的环境中进行开发,使用特定于平台的工具链和实用程序。
- 编辑位于 WSL 或已挂载的 Windows 文件系统(例如
/mnt/c
)中的文件。 - 在 Windows 上运行和调试基于 Linux 的应用程序。
命令和扩展直接在 Linux 发行版中运行,因此您不必担心路径问题、二进制兼容性或其他跨操作系统挑战。您可以在 WSL 中像在 Windows 中一样使用 VS Code。
观看这个 2 分钟的快速视频,了解在 WSL 中进行开发有多么容易。
有关更多信息,请参阅 在 WSL 中开发 文档。
Remote - SSH 扩展使您可以打开托管在任何运行 SSH 服务器的远程机器、VM 或容器上的文件夹或工作区。通过 SSH 进行开发使您可以
- 在比本地机器更大、更快或更专业的硬件上进行开发。
- 在不同的远程开发环境之间快速切换,并安全地进行更新,而无需担心影响本地机器。
- 调试在其他地方运行的应用程序,例如客户站点或云中。
例如,假设您正在进行深度学习项目。您通常需要一台 GPU 密集型虚拟机(例如 Azure Data Science Virtual Machine),该虚拟机配置了训练具有大规模数据集的模型所需的所有工具和框架。
您可以使用 Vim over SSH 或 Jupyter Notebooks 来编辑远程代码,但您会放弃本地开发工具的丰富性。相反,使用 Remote - SSH 扩展,您只需连接到 VM,安装必要的扩展,例如 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,这些 API 具有远程感知能力。例如,扩展作者应该使用 vscode.env.openExternal
API,而不是使用 open
包来加载浏览器窗口,这将会在本地打开浏览器。同样,有一个新的 clipboard
类,它会将内容放置在本地剪贴板上,正如预期的那样。
更多详细信息可以在更新后的 API 文档中找到,包括如何在远程环境中运行、测试和调试您的扩展。
开始使用
感谢您阅读到这里!
以下是开始进行 Visual Studio Code 远程开发的 3 个快速步骤
-
安装 Insiders 构建。在远程开发在 Stable 版本中可用之前,您需要使用此版本。Insiders 构建每天都会发布最新的功能和错误修复。如果您担心稳定性,请不要担心!我们使用 Insiders 构建来开发 VS Code,并且它可以与 Stable 版本并排安装,以防出现问题(并告知我们)。
-
获取 Remote Development Extension Pack,它安装了对 WSL、SSH 和容器的支持,并且是入门的最简单方法。如果您不需要所有这些,则可以卸载各个扩展。
-
阅读 文档。尝试 Dev Container 示例。如果您使用 Python 进行开发(你们中的许多人这样做!),请查看 Dan Taylor 关于远程 Python 开发的博客文章。
最后,如果您遇到问题,请提交问题。有关常见问题的解答,请参阅我们的 FAQ。
让我们知道您的想法!
祝您编码愉快,
@code 团队