使用 VS Code 进行远程开发
2019 年 5 月 2 日,VS Code 团队,@code
TL;DR
今天,我们很高兴宣布推出 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:在本地运行开发者工具,并连接到在物理或虚拟机(例如,容器或虚拟机)环境中远程运行的一组开发服务。这让您在远程环境的上下文中获得丰富的本地开发体验。
介绍 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 Notebook 来编辑您的远程代码,但这会牺牲本地开发工具的丰富性。相反,使用远程 - SSH 扩展,您只需连接到虚拟机,安装必要的扩展(如 Python),然后就可以利用 VS Code 的所有强大功能,例如 IntelliSense(代码补全)、代码导航和调试,就像在本地工作一样。
观看这个 2 分钟的快速视频,了解通过 SSH 在虚拟机上开发有多么容易。
有关更多信息,请参阅使用 SSH 进行开发文档。
开发容器扩展允许您使用 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。例如,扩展作者应使用 vscode.env.openExternal
API 来打开浏览器窗口,而不是使用 open
包来加载浏览器窗口,这将会在本地打开浏览器。类似地,还有一个新的 clipboard
类,它会按预期将内容放置到本地剪贴板上。
更多详细信息可以在更新的API 文档中找到,包括如何在远程环境中运行、测试和调试您的扩展。
开始使用
感谢您阅读到这里!
以下是开始 Visual Studio Code 远程开发的 3 个快速步骤:
-
安装 Insiders 构建版本。在远程开发功能在稳定版中可用之前,您需要使用此版本。Insiders 构建版本每天都会发布最新的功能和错误修复。如果您担心稳定性,大可不必!我们使用 Insiders 构建版本来开发 VS Code,它可以与稳定版并排安装,以防出现问题(并告知我们)。
-
获取远程开发扩展包,它安装了对 WSL、SSH 和容器的支持,是开始使用最简单的方式。如果您不需要所有这些,可以卸载单独的扩展。
-
阅读文档。尝试开发容器示例。如果您使用 Python 进行开发(许多人都是!),请查看 Dan Taylor 关于远程 Python 开发的博客文章。
最后,如果您遇到问题,请提交问题。有关常见问题的答案,请参阅我们的常见问题。
请告诉我们您的想法!
编程愉快,
@code 团队