工具应安装在WSL 2还是Windows系统中?
WSL开发工具安装与使用最佳实践
我来分享下自己在WSL上折腾各种开发工具的经验,踩过不少坑后总结的这些方案,应该能解决你的疑问:
核心原则:尽量区分WSL原生工具与Windows工具
有些工具(比如你提到的yarn)能跨环境使用,是因为Chocolatey安装的路径被WSL自动挂载到了/mnt/c/Program Files/这类目录,且yarn本身的依赖比较简单;但像Node.js、Flutter这类工具,依赖大量系统级组件、环境变量或路径配置,跨环境混用很容易出现版本冲突、路径识别错误、权限异常等问题,所以优先在WSL内安装原生版本是最优解。
各工具具体方案
Node.js/npm/Yarn
- 优先选择在WSL内安装:用
nvm(Node Version Manager)来管理版本,命令很简单:
这种方式能完美适配WSL的Linux环境,避免Windows和WSL之间的路径、权限冲突,而且切换版本也更灵活。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash nvm install node # 安装最新稳定版 - 如果非要用Windows上的Node:需要手动把Windows的Node路径添加到WSL的
PATH里,但容易出现依赖包安装失败(比如node-sass这类需要编译的包),不推荐长期使用。
Flutter
- 这个确实是WSL里的坑点,目前官方的兼容性问题还没完全解决,我的建议是:
- 在WSL内单独安装Flutter,按照Linux的安装指南配置好依赖(比如
libgtk-3-dev、libxcb-xinerama0-dev等系统库),把Flutter路径添加到WSL的环境变量中。 - 如果需要使用Windows的模拟器:可以通过WSL的X服务器(比如VcXsrv)来显示Linux的模拟器,或者配置Flutter远程调试连接Windows上的Android模拟器,避免混用两个环境的Flutter实例——否则会出现缓存不一致、路径无法识别等问题。
- 不要尝试直接调用Windows上的Flutter,大概率会遇到各种奇怪的错误。
- 在WSL内单独安装Flutter,按照Linux的安装指南配置好依赖(比如
.NET
- 微软对WSL的支持非常完善,直接在WSL内安装.NET SDK即可,和Windows上的版本完全独立,互不影响:
- 按照官方的Linux安装指南添加微软源,然后安装对应版本的SDK,比如:
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update && sudo apt-get install -y dotnet-sdk-7.0 - 跨平台的.NET Core/.NET 5+项目可以在WSL和Windows之间无缝切换,但注意项目文件尽量放在WSL的文件系统中(
/home/你的用户名/下),不要放在/mnt/c/,否则编译速度会很慢。 - 如果是.NET Framework项目(只能在Windows上运行),可以在WSL里通过
wine调用Windows的dotnet命令,但体验不佳,建议直接在Windows环境下开发这类项目。
- 按照官方的Linux安装指南添加微软源,然后安装对应版本的SDK,比如:
通用最佳实践
- 优先使用WSL原生工具:尤其是跨平台的开发工具,WSL的环境更接近生产服务器,能避免“本地Windows跑通,部署到Linux服务器出问题”的尴尬。
- 分开存放项目代码:把开发项目放在WSL的文件系统(
/home/你的用户名/)里,不要用/mnt/c/挂载的Windows路径,不仅速度更快,还能避免权限、文件换行符(CRLF/LF)的问题。 - 环境变量单独配置:WSL的环境变量和Windows是隔离的,需要在WSL的
~/.bashrc(或~/.zshrc,如果你用zsh)里配置工具的路径、密钥信息等,比如添加Flutter路径:export PATH="$PATH:/home/你的用户名/flutter/bin" - SSH密钥统一在WSL内管理:你查到的方案是对的,在WSL内生成的密钥放在
~/.ssh里,不仅WSL能用,Windows也可以通过\\wsl$\Ubuntu\home\你的用户名\.ssh路径访问,或者直接在Windows的Git里配置使用WSL的密钥,避免重复生成。
内容的提问来源于stack exchange,提问作者banksdev




