适用于 Linux 的 Windows 子系统(WSL)可以很好地使大多数命令行 Linux 工具可用,并且无需修改即可在 Windows 上运行。然而,当人们想要
- 使用构建项目Linux 工具链 没有得到良好支持的 Windows 版本(Ruby、Node 等)
- 使用编辑文件基于 Windows 的 GUI 编辑器例如 Visual Studio 代码。
问题是 Windows 应用程序无法修改虚拟 lxss 文件系统内的文件。直接修改这些文件已知会导致各种问题。
因此,在使用 WSL 进行开发时似乎只有两个次优选择:
将项目存储在 lxss (
/home/foo
) 下。常规工具链可以正常工作。但是,编辑仅限于基于终端的 Vim/Emacs 或可以在X 服务器不稳定,运行起来不如Windows上的原生编辑器流畅。将项目存储在 Windows 文件系统 (
/mnt/c/Users/foo
) 下。现在可以使用任何基于 Windows 的编辑器进行开发。但是,基于 Linux 的工具链很脆弱,因为它不是为在“网络驱动器”上使用而设计的,并且可能会导致文件监视或者数据库。
有没有办法可以同时实现两全其美的效果 - 即能够使用本机 Windows 应用程序进行编辑,但 Linux 工具链仍然像在本地驱动器上一样工作?
答案1
微软最近增加了对此的全面支持,它应该会在 2019 年 4 月 (19H1) 更新中全面推出。一旦准备就绪,9P 服务器将在 Linux 发行版运行时在后台运行。9P 服务器将能够处理 Linux 文件系统元数据,Windows 将能够将其视为网络驱动器,以便可以安全地访问它。您可以在以下网址阅读有关它的信息https://blogs.msdn.microsoft.com/commandline/2019/02/15/whats-new-for-wsl-in-windows-10-version-1903/。
借助新功能,只要通过 9P 服务器,您就可以安全地从 Windows 访问 Windows 和 Linux 文件系统文件。这将在 WSL 内部本地处理。例如,从 WSL 命令行,您将能够键入code /mnt/c/Users/username/src/windows-file.txt
以在 VS Code 中打开 Windows 文件,或键入code /home/username/src/linux-file.txt
以在 VS Code 中打开 Linux 文件。
如果您不是 Windows Insider 计划的成员,您将无法访问此功能,因此您仍然必须使用较旧的方法,例如 wslpath。
wslpath 将在 Windows 和 Linux 样式的路径之间进行转换,以便您可以轻松地从 WSL 命令行打开 Windows 文件。根据https://github.com/Microsoft/WSL/issues/3146#issuecomment-388118689,它将拒绝转换 Linux 文件系统路径(即 %AppData%\lxss),因为如果没有 9P,从 Windows 修改这些文件是不安全的。这意味着您无法打开/home/username/src/linux-file.txt
,但可以使用code "$(wslpath -aw /mnt/c/Users/username/src/windows-file.txt)"
。
过去,有许多第三方工具可以执行相同的转换,但 wslpath 本身就可以完成该转换——事实上,ls -l /bin/wslpath
它显示它只是一个指向 /init 的链接。
答案2
2018 年上半年,微软发布了对 WSL 的一些改进,解决了以下一些问题:
- 在 Insider Build 17063 及更高版本中,文件系统改进允许 Linux 实用程序在 DrvFs 文件上看到更多它们所期望的内容。
- 自 2017 年底以来,Visual Studio Code 能够直接运行 WSL 版本的 Node。
这些都不能完全解决我最初问题中的问题,但它们可能会在某些特定情况下提高可用性。
答案3
如果您想运行 Linux 命令并使用 Windows 编辑器进行编辑。您可以将源代码(您想要编辑和测试的)保存在文件系统中的某个位置(例如 c:\source\ ),然后通过 /mnt/c/source 在 Linux 控制台中访问它。希望这对您有所帮助。
答案4
P9 网络 FS 通过 UNC 路径模式公开\\wsl$\DISTRO
,例如\\wsl$\debian
。
Cygwin 具有安装 UNC 的语法,例如:
mount '//wsl$/debian' /wsl/debian
找到您的发行版列表,wsl -l
并在 Cygwin 中永久安装它们/etc/fstab
:
//wsl$/debian /wsl/debian ntfs binary,noacl,posix=0 0 0
//wsl$/ubuntu /wsl/ubuntu ntfs binary,noacl,posix=0 0 0
//wsl$/alpine /wsl/alpine ntfs binary,noacl,posix=0 0 0
现在您可以使用 Cygwin 的 Emacs W32、Midnight commander 等。
看:
2022 年更新MS Code 支持 WSL:https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-vscode
其他 IDE 的支持即将推出。