零、背景
前段时间博主曾经写过一篇文章《Windows 10 配合 Ubuntu 搭建舒适开发环境不完全指北》,文章介绍了如何使用 Windows 配合 Ubuntu 搭建舒适的开发环境,此后博主由于一些个人因素离开了上家公司,加入了目前的公司。不巧的是,新公司默认情况下配置的电脑也是 Windows(后来听说入职之前可以向 HR 申请 MBP,但我没有申请),而且电脑一旦配发,如无损坏需用满三年才能更换,而我特别不喜欢使用 Windows 的 Terminal 工具。一方面是开发环境部署困难,比如安装 Python 你可能需要自行下载 Python 安装镜像然后手动安装,安装完成后可能还需要配置环境变量,几乎所有的开发工具在 Windows 下的安装都是类似的;另一方面是 Terminal 界面丑陋,用户体验较差。即使有 Git Bash,Cmder,PowerShell,choco 等一系列辅助工具,还是无法赢得很多喜欢命令行工具的程序员的青睐, 我也一样。
随着 WSL 第二代和 Windows Terminal 的发布,以及几天以前微软推出了新的编程字体 https://github.com/microsoft/cascadia-code ,再次给使用 Windows 作为开发机器的程序员带来了重生的希望。但是 Windows Terminal 和 WSL 第二版必须要求 Windows 发布版本大于等于 1903,目前共同公司配备的 Windows 是 1809,恰好能用 WSL 的第一版,但不能用 Windows Terminal 和 WSL 第二版。好在 Windows 1903 的版本公司正在积极定制中,应该马上能用了,可喜可贺。
基于以上背景,本文记录了在 Windows 1809 版本下配合 WSL 第一版部署舒适开发环境的过程。
一、依赖
安装 Windows Terminal 要求必须是 Windows 10系统,且系统版本 >= 16237.0
按下win
建,输入 about your PC
,回车后在 Windows specifications
一节中查看系统版本
二、安装 WSL
2.1 开启子系统
方式一:(推荐)通过命令行开启
使用管理员方式打开 PowerShell 执行如下命令:
1
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
重启电脑
Win - R: 输入
shutdown -r -t 00
方式二: 使用图形化界面开启子系统功能
如果不是写作需要,我会更倾向使用命令行方式开启 WSL 功能,使用更少的操作完成更复杂的功能,这是程序员与生俱来的特点,因为时间是宝贵的。
步骤1: 按 Win - R,输入 control
后回车
步骤2: 点击 “Uninstall a program”
步骤3: 点击 “Turn Windows features on or off “
步骤4:找到 “Windows Subsystem for Linux” 确保前面的选择框被选中
重启电脑。
2.2 安装 Ubuntu 16.04
打开 Microsoft Store,输入 Ubuntu,选择评分最高的那个安装。
安装完成后,初次打开 Ubuntu Terminal 会进行初始化,输入 Ubuntu 的账号和密码,回车后等待初始化完成即可。
三、WSL 初始化
替换国内源
备份
/etc/apt/sources.list
后,使用 root 权限修改 sources.list 的内容,博主使用的是清华大学提供的镜像,内容如下:1
2
3
4
5
6
7
8
9
10
11deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse详细信息请查阅 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/
更新系统
1
sudo apt update
安装 ssh
系统更新完成后,默认会安装旧版
openssh-server
, 所以需要手动卸载旧版openssh-server
1
sudo apt remove openssh-server
由于旧版
openssh-server
配置和最新版不兼容,所以需要删除原来的配置1
sudo rm -rf /etc/ssh/*
安装
openssh-server
1
sudo apt install openssh-server
注意: 由于 WSL 和 Windows 共享端口,而 22 端口被 Windows 占用,所以需要手动更换 ssh 的端口或者确保 Windows 的 22 端口可用且防火墙开启 22 端口,显然更换 WSL 的 ssh 端口会简单一些,如下:
打开
sudo vim /etc/ssh/sshd_config
,将Port 22
改成Port 2222
(或者其他可用端口)启动 ssh
1
sudo service ssh start
正常启动后即可在 Windows 下使用 SSH 工具连接到 WSL,其中地址是 127.0.0.1 或者 localhost,端口和用户密码安装自定义的填写。
搭建开发环境
根据需要,安装好 Python/Node.js/NVM/Git/Docker 等工具。
注意: WSL 第一版中并没有使用真正的 Linux 的内核,因此导致 Dockerd 不可用,如需使用 Dockerd,请使用 WSL 2,具体参考 https://docs.microsoft.com/en-us/windows/wsl/wsl2-about
初始化项目
WSL 初始化完成后,将 Windows 的某个盘(如 d)划分为开发盘,Windows 的所有磁盘会被挂在到
/mnt/
目录下,进入/mnt/d/
工作目录,克隆项目到此处,开始愉快的开发。:)备注: 挂载在 WSL 下的 Windows 目录会带有绿色背景,这种色调对我来讲特别不舒服,就像是总在提示我不是真正的 Linux 文件系统,而是 Windows 挂在进来的 NTFS 系统一样。为了去掉绿色背景,我改了一下目录配色方案:
1
2touch ~/.dir_colors
echo "OTHER_WRITABLE 35;40" > ~/.dir_colors在
.bashrc
末位添加一行:1
eval `dircolors $HOME/.dir_colors`
source 一下
.bashrc
1
source ~/.bashrc
WSL 和项目初始化完成后,在 Windows 机器下使用相应编辑器或者 IDE 进行开发,开发完成后,在WSL中编译运行,爽哉!特别是最近在 VS Code 对 WSL 原生支持后,中小项目甚至可以将项目目录直接放在 WSL 里面,参考 https://code.visualstudio.com/docs/remote/wsl,只不多这种方式只能应付中小型项目,项目大到一定程度时可能需要专业的开发工具,如 WebStorm 。像 WebStorm 这类开发工具对 WSL 没有原生支持,无法打开(WSL的目录可以在Windows中被编辑,但是不能这样做,这样会导致权限出错)在 WSL 里面的项目,如果项目目录在 WSL 里面,这时要在 Windows 下开发就必须将 WSL 里的目录映射到 Windows 上,Samba 服务可以实现。经过笔者的实践表明,小项目使用何种方式开发都可以,当项目大一定程度后, VS Code 已经无法智能补全了,这时候使用 IDE 也许是更好的选择。这种场景下,使用 WebStorm 打开 Samba 共享出来的项目目录开发会变得异常卡顿,所以最优的选择还是直接将项目放在 Windows 下,使用 IDE 直接打开 NTFS 系统中的项目文件,然后挂载进 WSL 中编译运行。
提示:在 Windows 中使用 IDE 开发项目时,可以将 IDE 的 Terminal 绑定成 WSL,如JetBrains 设置 Teminal 为 WSL
四、踩过的坑
- openssh-server 新旧版本配置不兼容,需删除旧配置再安装新版本
- Ubuntu 18.04 的 WSL 无法安装 Samba 服务,Samba 服务在 WSL 下安装异常复杂,需要关闭 Windows 下的一些服务,释放占用的 139 和 445 端口。
- VS Code Remote + WSL 开发方式只适用于小项目,大型项目背景下, VS Code 索引文件不太友好,智能提示几乎崩溃
- WSL + Samba + WebStorm 在大项目背景下开发异常卡顿,甚至卡死。