使用 VS Code 进行远程开发
2019 年 5 月 2 日,由 VS Code 团队发布,@code
内容提要
今天,我们激动地宣布,Visual Studio Code 的三款新扩展程序已发布预览版。它们可以在容器中、物理或虚拟机上,以及在适用于 Linux 的 Windows 子系统 (WSL) 中实现无缝的远程开发。你可以通过安装远程开发扩展包立即开始。
注意:目前你需要使用 Insiders 版本,但远程开发支持最终将在稳定版中提供。
请继续阅读,了解我们是如何做到这一点的。
开发趋势
随着 VS Code 越来越受欢迎,我们有幸和机会与越来越多使用不同开发环境的用户进行交流,其中许多环境与我们自己的截然不同。我们试图找出可以推动 VS Code 前进、解决开发者实际痛点的方法。
在这些对话中,一个有趣的模式浮现出来。我们看到许多开发者试图使用 VS Code 针对配置了特定开发和运行时堆栈的容器及远程虚拟机进行开发,仅仅是因为在本地设置这些开发环境太困难、太具破坏性,在某些情况下甚至是不可能的。
我们都经历过这个问题。除非我们觉得是时候重装系统了 :),否则我们会犹豫是否要尝试一个新的技术栈,比如 Rust、Go、Node 或 Python3,因为担心会“搞乱”我们当前经过精心调校的环境。
Python 开发者想切换到 VS Code,但因为需要使用配置了特定 Python 堆栈的容器和虚拟机作为开发环境而无法实现。
由于代码库非常庞大,我们看到像 Facebook(以及微软!)这样的公司的工程师使用像 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 中开发的文档。
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 扩展的例子包括主题、代码片段、语言语法和键盘映射。
-
工作区扩展安装在远程。它们访问工作区中的文件和文件夹进行编辑,以提供 IntelliSense(代码补全)、跳转到定义、调试等功能。这些扩展也可能自定义 UI。这些扩展在远程运行,以便它们能够完全访问远程主机上的文件系统和工具。
大多数扩展已经更新,并且能在远程环境中正常工作,但如果你遇到某些不正常的扩展,请提交一个 issue 给该扩展。
扩展开发者
如果你正在创建 VS Code 扩展,我们已经实现了支持远程的新扩展 API。例如,扩展开发者不应使用 open
包来加载浏览器窗口,而应使用 vscode.env.openExternal
API,这将在本地打开浏览器。类似地,还有一个新的 clipboard
类,它会按预期将内容放入本地剪贴板。
更多细节可以在更新后的API 文档中找到,包括如何在远程环境中运行、测试和调试你的扩展。
开始使用
感谢你阅读到这里!
以下是开始进行 Visual Studio Code 远程开发的 3 个快捷步骤:
-
安装 Insiders 版本。在远程开发功能进入稳定版之前,你需要使用此版本。Insiders 版本每日发布,包含最新的功能和错误修复。如果你担心稳定性,不必担心!我们使用 Insiders 版本来开发 VS Code,并且它可以与稳定版并排安装,以防万一出现问题(请告诉我们)。
-
获取远程开发扩展包,它会安装对 WSL、SSH 和容器的支持,是开始使用的最简单方式。如果你不需要全部,可以卸载单个扩展。
-
阅读文档。尝试开发容器示例。如果你使用 Python 进行开发(你们中的许多人都这样做!),请查看 Dan Taylor 关于远程 Python 开发的博客文章。
最后,如果你遇到问题,请提交一个 issue。有关常见问题的答案,请参阅我们的常见问题解答。
让我们知道你的想法!
编程愉快,
@code 团队