在 WSL 中开发
Visual Studio Code WSL 扩展允许您直接从 VS Code 使用 Windows Linux 子系统 (WSL) 作为您的全职开发环境。您可以在基于 Linux 的环境中进行开发,使用 Linux 特有的工具链和实用程序,并可在 Windows 的舒适环境中运行和调试基于 Linux 的应用程序。
该扩展直接在 WSL 中运行命令和其他扩展,因此您可以编辑位于 WSL 或已挂载的 Windows 文件系统(例如 /mnt/c)中的文件,而无需担心路径问题、二进制兼容性或其他跨操作系统挑战。该扩展将在 WSL 内安装 VS Code Server;此服务器独立于 WSL 中任何现有的 VS Code 安装。

这使得 VS Code 能够提供本地品质的开发体验——包括完整的 IntelliSense(代码补全)、代码导航和调试——无论您的代码托管在哪里。
入门
注意:阅读完本主题后,您可以从介绍性的 WSL 教程开始。
安装
要开始使用,您需要
-
安装 Windows Linux 子系统以及您首选的 Linux 发行版。
注意:WSL 1 对于某些类型的开发确实存在一些已知限制。此外,由于扩展原生源代码中的
glibc依赖项,安装在 Alpine Linux 中的扩展可能无法工作。有关详细信息,请参阅远程开发和 Linux 一文。 -
在 Windows 端安装 Visual Studio Code(不要安装在 WSL 中)。
注意:在安装过程中出现选择其他任务提示时,请务必勾选添加到 PATH 选项,这样您就可以使用
code命令轻松地在 WSL 中打开文件夹。 -
安装 WSL 扩展。如果您计划在 VS Code 中使用其他远程扩展,可以选择安装 远程开发扩展包 (Remote Development extension pack)。
打开远程文件夹或工作区
从 WSL 终端
在 VS Code 中打开 Windows Linux 子系统内的文件夹,与从命令提示符或 PowerShell 打开 Windows 文件夹非常相似。
-
打开一个 WSL 终端窗口(使用开始菜单项,或者通过在命令提示符/PowerShell 中输入
wsl)。 -
导航到您想要在 VS Code 中打开的文件夹(包括但不限于
/mnt/c等 Windows 文件系统挂载点)。 -
在终端中输入
code .。首次执行此操作时,您应该会看到 VS Code 正在获取在 WSL 中运行所需的组件。这只需要很短的时间,而且只需要执行一次。注意:如果此命令不起作用,您可能需要重启终端,或者在安装时未将 VS Code 添加到路径中。
-
片刻之后,一个新的 VS Code 窗口将出现,并且您会看到一条通知,说明 VS Code 正在 WSL 中打开该文件夹。

VS Code 现在将继续在 WSL 中进行自我配置,并在取得进展时为您更新状态。
-
完成后,您会在左下角看到一个 WSL 指示器,您就可以像平时一样使用 VS Code 了!

就是这样!您在此窗口中执行的任何 VS Code 操作都将在 WSL 环境中执行,从编辑和文件操作到调试、使用终端等等,应有尽有。
从 VS Code 内部
或者,您也可以直接从 VS Code 打开 WSL 窗口
- 启动 VS Code。
- 按 F1,选择 WSL: Connect to WSL(连接到默认发行版),或选择 WSL: Connect to WSL using Distro(连接到特定发行版)。
- 使用“文件”菜单打开您的文件夹。
如果您已经打开了一个文件夹,也可以使用 WSL: Reopen Folder in WSL 命令。系统会提示您选择要使用的发行版。
如果您处于 WSL 窗口中并想在本地窗口中打开当前输入,请使用 WSL: Reopen in Windows。
从 Windows 命令提示符
要直接从 Windows 提示符打开 WSL 窗口,请使用 --remote 命令行参数
code --remote wsl+<distro name> <path in WSL>
例如:code --remote wsl+Ubuntu /home/jim/projects/c
我们需要推测输入路径是文件还是文件夹。如果它有文件扩展名,则被视为文件。
若要强制打开文件夹,请在路径末尾添加斜杠或使用
code --folder-uri vscode-remote://wsl+Ubuntu/home/ubuntu/folder.with.dot
若要强制打开文件,请添加 --goto 或使用
code --file-uri vscode-remote://wsl+Ubuntu/home/ubuntu/fileWithoutExtension
使用 Git
如果您在 WSL 和 Windows 中使用同一个仓库,请确保设置一致的行尾符。详细信息请参阅提示与技巧。
您还可以通过配置 WSL 使用 Windows Git 凭据管理器来避免输入密码。详细信息请参阅提示与技巧。
管理扩展
VS Code 在两个位置之一运行扩展:本地(UI/客户端侧)或 WSL 中。虽然影响 VS Code UI 的扩展(如主题和代码片段)是安装在本地的,但大多数扩展将驻留在 WSL 中。
如果您从“扩展”视图安装扩展,它将自动安装在正确的位置。安装完成后,您可以根据类别分组判断扩展安装在哪里。会有 本地 - 已安装 (Local - Installed) 类别以及一个 WSL 专属类别。


注意:如果您是扩展开发者,并且您的扩展无法正常工作或安装位置错误,请参阅支持远程开发了解详细信息。
实际上需要在远程运行的本地扩展将在 本地 - 已安装 类别中显示为变灰且禁用状态。选择 安装 (Install) 即可在远程主机上安装扩展。

您还可以通过以下方式将所有本地安装的扩展安装到 WSL 中:转到“扩展”视图,点击 本地 - 已安装 标题栏右侧的云形图标,选择 Install Local Extensions in WSL: {Name}。这将显示一个下拉菜单,您可以在其中选择要在 WSL 实例中安装哪些本地已安装的扩展。

在 WSL 中打开终端
从 VS Code 在 WSL 中打开终端很简单。一旦在 WSL 中打开了文件夹,您在 VS Code 中打开的任何终端窗口(终端 > 新终端)都将自动在 WSL 中运行,而不是在本地。
您也可以在同一个终端窗口中使用 code 命令行来执行许多操作,例如在 WSL 中打开新文件或文件夹。输入 code --help 查看命令行中可用的选项。

在 WSL 中进行调试
在 WSL 中打开文件夹后,您可以像在本地运行应用程序一样使用 VS Code 的调试器。例如,如果您选择 launch.json 中的启动配置并开始调试(F5),应用程序将在远程主机上启动,并将调试器附加到该程序。
有关在 .vscode/launch.json 中配置 VS Code 调试功能的详细信息,请参阅调试文档。
WSL 特定设置
当您在 WSL 中打开文件夹时,VS Code 的本地用户设置也会被重用。虽然这能保持您用户体验的一致性,但您可能希望在本地机器和 WSL 之间调整某些设置。幸运的是,连接到 WSL 后,您还可以通过从命令面板(F1)运行 Preferences: Open Remote Settings 命令,或通过在设置编辑器中选择 远程 (Remote) 选项卡来设置 WSL 特定设置。只要您在 WSL 中打开文件夹,这些设置就会覆盖您现有的任何本地设置。
进阶:环境设置脚本
当 VS Code Remote 在 WSL 中启动时,不会运行 shell 启动脚本。这样做是为了避免与针对 shell 调整过的启动脚本产生冲突。如果您想运行其他命令或修改环境,可以在安装脚本 ~/.vscode-server/server-env-setup(Insiders 版本为 ~/.vscode-server-insiders/server-env-setup)中进行。如果该脚本存在,它会在服务器启动前被处理。
该脚本必须是有效的 Bourne shell 脚本。请注意,无效的脚本会阻止服务器启动。如果您编写的脚本导致服务器无法启动,则必须使用常规的 WSL shell 并删除或重命名该安装脚本。
检查 WSL 日志(WSL: Show Log)以获取输出和错误信息。
进阶:在容器中打开 WSL 2 文件夹
如果您使用的是 WSL 2 和 Docker Desktop 的 WSL 2 后端,您可以使用 Dev Containers 扩展来处理存储在 WSL 内部的源代码!只需按照以下步骤操作
-
如果尚未安装,请安装并设置 Docker Desktop 的 WSL 2 支持。
提示:转到 设置 > 资源 > WSL 集成,并为您将要使用的 WSL 发行版启用 Docker 集成。
-
如果尚未安装,请在 WSL 扩展之外安装 Dev Containers 扩展。
-
接下来,按照通常方式在 WSL 中打开您的源代码文件夹。
-
在 WSL 中打开文件夹后,从命令面板(F1)选择 Dev Containers: Reopen in Container。
-
如果该文件夹中没有
.devcontainer/devcontainer.json文件,系统会要求您从可过滤列表中选择一个起点,或选择一个现有的 Dockerfile 或 Docker Compose 文件(如果存在)。
-
VS Code 窗口(实例)将重新加载并开始构建开发容器。进度通知会提供状态更新。

-
构建完成后,VS Code 将自动连接到容器。现在,您可以在容器内处理您的源代码了。
有关更多信息,请参阅 Dev Containers 文档。
已知限制
本节包含 WSL 的常见已知问题列表。目的并非提供完整的问题列表,而是突出显示 WSL 中观察到的一些常见问题。
我在 WSL 1 中尝试重命名打开的工作区中的文件夹时看到 EACCES: permission denied 错误
这是 WSL 文件系统实现中的一个已知问题(Microsoft/WSL#3395, Microsoft/WSL#1956),由 VSCode 活动的文件监视器引起。该问题仅在 WSL 2 中得到修复。
要避免此问题,请将 remote.WSL.fileWatcher.polling 设置为 true。但是,基于轮询的文件监视会对大型工作区产生性能影响。
对于大型工作区,您可能需要增加轮询间隔:remote.WSL.fileWatcher.pollingInterval,并控制要监视的文件夹: files.watcherExclude 。
WSL 2 没有该文件监视器问题,也不受此新设置的影响。
WSL 1 中的 Golang
| 问题 | 现有问题 |
|---|---|
| Delve 调试器在 WSL 下无法工作 | go-delve/delve#810, Microsoft/vscode-go#926 |
WSL 1 中的 Node.js
| 问题 | 现有问题 |
|---|---|
| NodeJS 错误: spawn EACCES (此错误有多种变体) | Microsoft/WSL#3886 |
| Webpack HMR 不工作 | Microsoft/WSL#2709 |
| Firebase 通过 node 在 WSL 上慢得无法使用 | Microsoft/WSL#2657 |
Git 限制
如果你使用 SSH 克隆 Git 仓库,并且你的 SSH 密钥有密码短语,VS Code 的拉取和同步功能在远程运行时可能会挂起。请使用不带密码短语的 SSH 密钥,使用 HTTPS 克隆,或者从命令行运行 git push 来解决此问题。
容器工具扩展限制
虽然 Container Tools 扩展可以远程和本地运行,但如果它已经安装在本地,您将无法在没有先卸载本地版本的情况下安装到远程 SSH 主机上。我们将在未来的 VS Code 版本中解决此问题。
扩展限制
许多扩展无需修改即可在 WSL 中工作。但是,在某些情况下,某些功能可能需要更改。如果您遇到扩展问题,请参阅此处获取常见问题及解决方案摘要,在报告问题时可以将其提供给扩展开发者。
此外,当使用基于 Alpine Linux 的发行版时,安装在 WSL 中的某些扩展可能会因扩展内部原生代码中的 glibc 依赖项而无法工作。详细信息请参阅在 Linux 上进行远程开发一文。
常见问题
为什么系统要求我更改默认发行版?
当使用 WSL: Connect to WSL using Distro 且在 Windows 10 2019 年 5 月更新(版本 1903)之前的 WSL 上运行时,系统会要求您切换默认发行版,因为 WSL 命令只能在默认发行版上工作,且尚不支持 -d 选项。
您可以随时通过使用 wslconfig.exe 手动切换默认发行版。
例如
wslconfig /setdefault Ubuntu
您可以查看已安装的发行版,使用
wslconfig /l
我看到了关于缺少库或依赖项的错误
一些扩展依赖于某些 WSL Linux 发行版标准安装中没有的库。您可以使用其包管理器将其他库添加到 Linux 发行版中。对于基于 Ubuntu 和 Debian 的发行版,运行 sudo apt-get install <package> 来安装所需的库。查看扩展的文档或提到的运行时以获取更多安装详情。
WSL 扩展的连接要求是什么?
WSL 扩展和 VS Code Server 需要出站 HTTPS (端口 443) 连接以访问:
update.code.visualstudio.comvscode.download.prss.microsoft.commarketplace.visualstudio.com*.gallerycdn.vsassets.io(Azure CDN)
一些扩展(如 C#)会从 download.microsoft.com 或 download.visualstudio.microsoft.com 下载次要依赖项。其他扩展(如 Visual Studio Live Share)可能有额外的连接要求。如果您遇到问题,请查阅扩展文档以获取详细信息。
服务器与 VS Code 客户端之间的所有其他通信通过随机本地 TCP 端口完成。您可以在网络连接文章中找到 VS Code 本身需要访问的位置列表。
我在代理服务器后面并且有连接问题
Windows 或 WSL 端可能缺少代理设置。
当从 VSCode 中打开远程窗口时,WSL 扩展会尝试在 Windows 端下载 VSCode 服务器。因此,它使用 Windows 端代理配置
- 继承自操作系统设置
- 如 Visual Studio Code 中的网络连接 所述
当从 WSL 终端启动远程 VSCode 时,下载是使用 WSL 发行版中的 wget 完成的。代理设置可以在以下位置配置
一旦服务器启动并运行,就会使用“远程”选项卡上的代理设置。
我可以强制扩展在本地/远程运行吗?
扩展通常设计和测试为仅在本地或远程运行,而不是两者都运行。但是,如果扩展支持,你可以在 settings.json 文件中强制它在特定位置运行。
例如,以下设置将强制 Container Tools 扩展在本地运行,以及 Remote - SSH: Editing Configuration Files 扩展在远程运行,而不是使用它们的默认设置:
"remote.extensionKind": {
"ms-azuretools.vscode-containers": [ "ui" ],
"ms-vscode-remote.remote-ssh-edit": [ "workspace" ]
}
将 "workspace" 改为 "ui" 会强制扩展在本地 UI/客户端侧运行。通常,除非扩展文档中另有说明,否则这仅应用于测试,因为它可能导致扩展损坏。详细信息请参阅支持远程开发的文章。
作为扩展作者,我需要做什么?
VS Code 扩展 API 抽象了本地/远程细节,因此大多数扩展无需修改即可工作。但是,考虑到扩展可以使用它们想要的任何节点模块或运行时,有时可能需要进行调整。我们建议你测试你的扩展,以确保不需要更新。有关详细信息,请参阅支持远程开发。
问题或反馈
- 请参阅提示与技巧或常见问题解答 (FAQ)。
- 在 Stack Overflow 上搜索。
- 提出功能请求或报告问题。
- 为我们的文档或VS Code 本身做出贡献。
- 请参阅我们的贡献指南了解详细信息。