在 Windows 系统中,我平时习惯将开发软件安装在
D:\Develop
目录下
可能用到的软件
- Android Studio
- 宝塔面板
- Clash
- Dart
- fvm
- git
- TortoiseGit
- JDK
- Microsoft VS Code
- Microsoft Visual Studio
- nvm
- Notepad++
- Navicat Premium
- Python
- XshellXftpPortable
- Docker
- Windows Terminal
科学上网
这年头当个程序员不会点魔法都没法干活了,我自己用的是Clash
,Chrome 浏览器插件配合使用的是Proxy SwitchyOmega
至于是哪里的魔法学院我就不细说了,我只讲这两个软件如何搭配使用
- 新建一个情景模式,名字取个自己喜欢的
- 协议选
HTTP
,服务器填127.0.0.1
,端口7890
(因为用的是 Clash),然后保存
- 切到自动切换(auto switch)模式,在
2
的位置填入raw.githubusercontent.com
,模式选刚才创建的,我这里创建的是Clash
;3
的位置选刚才创建的模式,4
的位置填入规则列表的链接,接着点击5
,最后保存
- 然后
Proxy SwitchyOmega
选择使用自动切换模式
- 最后 PC 端的 Clash 代理模式选择
Global
(全局)就行了,对于访问网站来说开不开系统代理都无所谓,如果是给 PC 软件使用的话,打开一下系统代理就行
启用Windows的WSL功能
TIP
可以通过在 PowerShell 执行wsl --install
命令进行 WSL 的初始化安装,默认会安装 Ubuntu 作为 Linux 子系统,此时会自动更新到 WSL2。输入wsl -l -o
可以查看官方提供的 Linux 发行版列表
下面讲讲手动设置 WSL2 的方式
- 启用 win10 的开发者模式
- 打开控制面板的
Windows功能
,勾选Hyper-V
Windows 虚拟机监控程序平台
适用于 Linux 的 Windows 子系统
虚拟机平台
只是简单玩玩 WSL 的话,勾选适用于 Linux 的 Windows 子系统
就够了,但我这里会后续可能会涉及到Kali
和Docker
,所以干脆一次直接安装完。安装完成后会提示重启一次电脑
- 下载WSL2 Linux内核更新包并安装
- 将 WSL2 设置为默认版本
wsl --set-default-version 2
- 在 Win10 应用商店搜索
Ubuntu
,然后安装它,也可以通过命令wsl --install -d Ubuntu
来安装
TIP
如果之前已经安装了 WSL1 版本的子系统,那么在上述第 4 步之后再执行wsl --set-version Ubuntu 2
命令将子系统更新到 WSL2
安装完成后根据提示设置系统用户名和密码,输入sudo passwd
来初始化root
用户的密码,会提示输入当前系统用户的密码,接着才是设置root
用户的密码,要输入两次。之后如果想切到root
用户的话就键入su
安装Windows Terminal
在微软应用商店搜索Windows Terminal
,然后安装它,用它来配合 WSL 的使用体验我个人是觉得很爽的
将 apt 更换为阿里源
切到root
用户,使用顺手的编辑器修改文件vim /etc/apt/sources.list
,将所有源链接替换为https://mirrors.aliyun.com/ubuntu/
可以使用vim
的替换命令进行批量修改,例如::%s#http://cn.archive.ubuntu.com#https://mirrors.aliyun.com#g
接着输入apt-get update
刷新源信息
注意
子系统和 win10 是使用的相同网络,端口也都是共用的,避免端口占用冲突
如果要在 Windows 的文件资源管理器中查看 Linux 的文件的话,只需在地址栏中输入\\wsl$
即可打开 Linux 的文件系统
WSL端口映射
由于每次重启宿主机后,WSL 的 ip 地址都会发生变化(稍后讲 WSL 设置静态 IP 的方法),所以需要重新映射,在 PowerShell 中执行
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=win10端口 connectaddress=虚拟机的ip connectport=虚拟机的端口
检查是否映射成功netsh interface portproxy show all
在 Ubuntu 中查看 ip 地址的命令是ifconfig
,其中eth0
中的inet
就是虚拟机的 ip 地址
WSL设置静态IP
比如,我要给 WSL 设置的静态 IP 为172.20.19.2
,其网关地址为172.20.19.1
首先将 WSL 自动生成resolv.conf
的机制关闭,执行sudo vim /etc/wsl.conf
,添加如下内容
[network]
generateResolvConf = false
接着执行sudo vim /etc/init.d/ip-setup.sh
创建一个脚本,并该脚本添加执行权限sudo chmod +x /etc/init.d/ip-setup.sh
,其内容如下
#!/bin/sh
sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 172.20.19.2/24 broadcast 172.20.19.255 dev eth0
sudo ip route add 0.0.0.0/0 via 172.20.19.1 dev eth0
sudo rm -f /etc/resolv.conf
sudo echo nameserver 8.8.8.8 > /etc/resolv.conf
上述命令先删除掉 WSL 已经配置的 IP 地址,然后为其分配172.20.19.2/24
,最后配置路由并指定 DNS 服务器为8.8.8.8
这样配置后 WSL 暂时没能联网,还需要到宿主机执行命令修改虚拟网络适配器
Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 172.20.19.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 172.20.19.0/24;
上述命令中,首先找到 vEthernet (WSL) 这个网络适配器,然后将其所有已有的 IP 地址删除,然后为其添加172.20.19.1/24
的 IP 地址。接着是设置 NAT:首先删除名字叫做 WSLNat 的 NAT(因为我们后续创建的 NAT 名字叫做 WSLNat,这些命令每次启动系统后都需要执行,因此可能系统中已经存在名为 WSLNat 的 NAT 了,为了防止冲突,如果存在的话就先删掉),然后创建一个名字叫做 WSLNat 的 NAT,设置内部地址为172.20.19.0/24
最后需要将上述两部分指令合并到一个脚本中一起执行
回到宿主机,Win+R
打开运行,输入shell:startup
,在启动文件夹中新建脚本ubuntu_start.bat
,其内容如下
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
wsl -u root /etc/init.d/ip-setup.sh
powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 172.20.19.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 172.20.19.0/24;"
wsl -u root /etc/init.d/wsl-init.sh
第一行的作用是让该脚本获取管理员权限并执行自身,因为其中调用 PowerShell 的部分需要管理员权限。最后一行
wsl -u root /etc/init.d/wsl-init.sh
是额外的启动配置,后面会讲
如果发现 WSL 内无法 ping 通网关地址172.20.19.1
的话,在宿主机中以管理员权限打开 PowerShell 执行如下命令添加一条防火墙入站规则
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
并且启用这一条规则
SSH配置
在新安装的 Ubuntu 中把openssh-server
给卸载了,因为它预装的可能不完整,需要重新安装一下,切到root
用户
apt remove openssh-server
apt install openssh-server
接着来修改 ssh 的配置,在终端输入vim /etc/ssh/sshd_config
,修改或增加以下几个配置项(根据自己的喜好设置端口)
Port 2233
ListenAddress 0.0.0.0
LoginGraceTime 2m
StrictModes yes
PermitRootLogin yes
PasswordAuthentication yes
修改完毕后重启 ssh 服务service ssh --full-restart
在上面,我已经将 WSL 的 IP 地址修改成172.20.19.2
(根据自己的情况填写 WSL 的 ip 地址),所以这里要做一下端口映射,回到宿主机执行
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2233 connectaddress=172.20.19.2 connectport=2233
如果遇到端口被防火墙拦截的情况,需在宿主机的 PowerShell 中执行
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2233
注意
如果在使用Xshell
连接时提示找不到匹配的key exchange算法
或找不到匹配的host key算法
,更新Xshell
到一个比较新的版本就好了,因为服务端的openssh-server
加密算法更新了
WSL设置代理
- 先在宿主机中查看 vEthernet (WSL)的 ip 地址,我这里的是
172.20.19.1
,然后确保 WSL 子系统和宿主机之间能够双向 ping 通
确定魔法工具所使用的代理端口,我这里的是
7890
,并启用局域网代理设置代理的三种方式
- 临时设置,这种方式设置的代理仅在当前终端生效,关闭当前终端后就会恢复之前的环境变量。在终端输入
- 修改
.bashrc
文件,这种方式对当前用户永久生效。在终端输入vim ~/.bashrc
,然后在文件末尾添加以下两行后保存退出,最后source .bashrc
重载配置使其生效 - 修改
/etc/profile
文件,这种方式对所有用户永久生效。在终端输入vim /etc/profile
,然后在文件末尾添加以下两行后保存退出,最后在终端输入source /etc/profile
重载配置且重启 WSL 才能使配置生效
export http_proxy="http://172.20.19.1:7890"
export https_proxy="http://172.20.19.1:7890"
文件系统
需要注意的是我们现在有了两套系统,两者的文件类型并不一致,跨系统访问和传输文件的话效率会下降很多,最好各存各的,以用户目录为例
- 如果在 Windows 上开发,就将文件放在:
C:\Users\<UserName>\
,也可以放在其他盘符的某个文件夹下统一管理,像我就是D:\Workspace
- 如果在 Ubuntu 上开发,就将文件放在:
\\wsl$\ubuntu\home\<UserName>\
创建工作区的软链接,比如我 Windows 系统中的代码是存放在是D:/Workspace
,里面有一个前端项目test
,那么在子系统中的软链接为
sudo ln -s /home/code/test /mnt/d/Workspace/test
TIP
上面的/mnt
可以理解成是Windows
系统,然后/d
表示 D 盘,后面的文件夹就很好理解了,不再展开说明
WSL迁出系统盘
由于 WSL 是作为一个 WindowsApp 默认安装在系统盘中的,而系统盘的可用空间会随着使用时间的推移而逐渐变少,所以需要将 WSL 迁出到其他盘,比如我这里将 WSL 迁到了D
盘
变少的快慢因人而异,像我有强迫症,对文件管理有很高的要求,120G 的系统盘用了两年多还剩 40G 左右的空间
WSL 的迁移大致分为六步
- 查看自己的 WSL 和 Linux 发行版本,可以看到我这里的发行版本是
Ubuntu
,后续的操作都将围绕这个发行版本来进行
- 关闭 WSL 服务
wsl --shutdown
- 将原位置的 Linux 发行版导出到指定位置,最好要在管理员模式的 PowerShell 执行
wsl --export Ubuntu D:\WSL\Ubuntu.tar
- 在导出位置确定有
Ubuntu.tar
备份文件生成之后,执行注销原 WSL 命令wsl --unregister Ubuntu
- 在新的位置导入 Linux 发行版,最好要在管理员模式的 PowerShell 执行
wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar
- 修改用户名为原来的名字,执行
Ubuntu config --default-user jandan
迁移完成后把之前生成的备份文件Ubuntu.tar
删除
安装Docker
在 Windows 中使用 Docker 有以下两种方式
直接在WSL2里面安装
这种安装方式要求对 docker 非常熟练,因为所有操作全都是执行命令,docker-compose
需要单独安装
在用户目录下输入vim install-docker.sh
,编写一个脚本用来把 docker 的下载和安装过程整合在一起,其内容如下
#!/bin/sh
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
if [ !$(getent group docker) ];
then
sudo groupadd docker
else
echo "docker user group already exists"
fi
sudo gpasswd -a $USER docker
sudo service docker restart
rm -rf get-docker.sh
然后执行sh install-docker.sh
等待 docker 的安装
安装完成后执行docker version
来检查是否成功,如果发现 Server 没启动的话则执行sudo service docker start
默认情况下,docker server 是不跟随 WSL 的启动而启动的,所以需要手动将其加入自启服务,执行sudo systemctl enable docker
即可
在Windows上安装Docker Desktop
这种安装方式使用起来适合 docker 新手,因为有 GUI,而且软件内置有docker-compose
先去下载Docker Desktop
由于Docker Desktop
的安装程序不提供设置安装路径的功能,而且默认是安装到C:\Program Files\Docker
目录下的,这就很占系统盘的宝贵空间
为了解决这个问题,需要对其默认安装路径做一个软链接处理,先在目标位置创建Docker
文件夹,然后管理员模式打开 CMD 执行mklink /j "C:\Program Files\Docker" "D:\Develop\Docker"
软链接做好后再开始安装,记得勾选使用 WSL2 代替 Hyper-V
安装完成后进入软件,打开设置界面,修改 docker 数据和镜像的存储路径
将 Ubuntu 和 docker 关联起来
由于众所周知的原因,Docker 官方源 ban 掉国内 ip 了,所以需要更改为国内镜像源
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
设置完成后打开 WSL,输入docker ps
,看到如下的输出就表示 Docker 和 WSL 连接成功了
在WSL中安装宝塔
上面讲了 Docker 的安装之后,其实宝塔有没有都无所谓了,但它在我还不会玩 Docker 的那段时间还是帮了我不少,姑且还是讲讲吧
切到root
用户执行命令
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec
安装完成后会在终端输出面板的登录信息,记得保存下来,内网地址的可以替换成127.0.0.1
也是可以打开面板的,外网地址的那个不用管,反正家庭宽带的公网 IP 也是假的
WARNING
接下来安装运行环境的软件时一定要记得选编译安装
设置宝塔面板跟随Windows开机自启
- 在 Ubuntu 中创建一个脚本
sudo vim /etc/init.d/wsl-init.sh
,内容如下
#!/bin/sh
/etc/init.d/nginx start
/etc/init.d/mysqld start
bt start
因为 WSL2 中的 Ubuntu 不能自启软件,所以才这么搞; 然后你会发现宝塔自启后,nginx、mysqld 等服务还是不会自启,可以把相应服务的启动指令同样放在这里来解决
- 给该脚本添加执行权限
sudo chmod +x /etc/init.d/wsl-init.sh
- 将该脚本添加到上面的
ubuntu_start.bat
开机脚本中,这样每次 Windows 启动时就会自动执行wsl-init.sh
脚本了
git和TortoiseGit的配置
先去下载git 和 TortoiseGit,具体的安装步骤就不说了,百度一搜各种各样的都有,这里主要讲我对 git 的环境变量配置
安装完成后打开 TortoiseGit 设置,并修改其 SSH 客户端为D:\Develop\Git\usr\bin\ssh.exe
给用户变量Path
增加以下两个值D:\Develop\Git\cmd
和D:\Develop\TortoiseGit\bin
接着给 git 设置用户名和邮箱,具体的邮箱地址我就不放出来了,避免泄漏
git config --global user.name Jandan
git config --global user.email ***@gmail.com
生成公钥,输入指令后无脑按回车就行
ssh-keygen -m PEM -t ed25519 -C "***@gmail.com"
打开 github 网站,进入设置,填入刚才生成的ssh key
,如果是首次和 github 建立连接,则输入ssh -T git@github.com
创建连接信息
对于使用 http 方式连接远程仓库的,输入以下指令用来保存账号和密码
git config credential.helper store
nvm和nodejs的配置
Ubuntu 中安装 nvm
- 命令行中执行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
,脚本运行结束后打开一个新的终端窗口,输入nvm -v
查看是否安装成功 - 查看所有可用的 node 版本
nvm ls-remote
- 安装 LTS 版本的 node,
nvm install --lts
,安装后会自动切到这个版本
Windows中安装nvm
先去 Github 下载nvm
设置安装目录为D:\Develop\nvm
设置 nodejs 软链接指向的目录为D:\Develop\nvm\nodejs
,之后就无脑下一步
安装完成后会自动生成两个系统环境变量NVM_HOME
和NVM_SYMLINK
nvm list available
查看所有可用的 nodejs 版本nvm ls
查看当前安装的 nodejs 版本nvm current
查看当前使用的 nodejs 版本
然后使用 nvm 命令安装所需要的 nodejs 版本,我这里安装的是最新的 LTS 版本
nvm install 18.17.1
nvm use 18.17.1
接着在 nvm 安装目录下新建如下几个文件夹
node_global
node_modules
node_cache
Yarn
Global
Cache
pnpm
.pnpm-store
cache
global
state
创建好上述几个文件夹后开始接着补环境变量
Path => %NVM_HOME%\node_global
NODE_PATH => %NVM_HOME%\node_global\node_modules
修改 npm 的缓存目录、全局包存放目录和设置淘宝源
npm config set prefix "D:\Develop\nvm\node_global"
npm config set cache "D:\Develop\nvm\node_cache"
npm config set registry https://registry.npmmirror.com
⚡ npm 的官方源是 https://registry.npmjs.org
安装yarn
npm i -g yarn
修改 yarn 的缓存目录和全局包存放目录
yarn config set global-folder "D:\Develop\nvm\Yarn\Global"
yarn config set cache-folder "D:\Develop\nvm\Yarn\Cache"
安装pnpm
npm i -g pnpm
修改 pnpm 的缓存目录和全局包存放目录
# 全局仓库路径
pnpm config set store-dir "D:\Develop\nvm\pnpm\.pnpm-store"
# 全局包路径
pnpm config set global-dir "D:\Develop\nvm\pnpm\global"
# 全局缓存路径
pnpm config set cache-dir "D:\Develop\nvm\pnpm\cache"
# pnpm-state.json文件目录
pnpm config set state-dir "D:\Develop\nvm\pnpm\state"
我常用的 npm 全局包
- yarn
- pnpm
- ts-node
- whistle
- nodemon
- pm2
- live-server
- prisma
- appium
- appium-doctor
- docsify-cli
- eas-cli
- @vue/cli
- @tarojs/cli
- @nestjs/cli
- @ant-design/pro-cli
至此,nvm 和 nodejs 的环境配置结束
JDK配置
- 根据所安装的 JDK 版本,新建一个带有大版本号的用户变量,例如
JAVA17_HOME
,变量值填入安装路径D:\Develop\Java\jdk-17
- 再新建一个用户变量
JAVA_HOME
,变量值填入%JAVA17_HOME%
。如果安装有多个 JDK 版本时,只需要修改JAVA_HOME
变量的值即可切换全局的 JDK 版本,例如修改为%JAVA11_HOME%
- 给用户变量
Path
添加一个值%JAVA_HOME%\bin
AndroidStudio配置
安装 Android Studio 并下载所需要的相关 SDK 后可以选择设置全局环境变量也可以给某个 Flutter 版本设置局部环境变量:
- 全局环境变量
- 新建用户变量
ANDROID_HOME
和ANDROID_SDK_ROOT
,变量值填入D:\Develop\Android\Sdk
- 新建用户变量
ANDROID_SDK_HOME
,变量值填入D:\Develop\Android\AVD
,这个是设置虚拟机路径 - 给用户变量
Path
添加以下值%ANDROID_HOME%
、%ANDROID_SDK_HOME%
、%ANDROID_HOME%\platform-tools
、%ANDROID_HOME%\emulator
、%ANDROID_HOME%\tools
和%ANDROID_HOME%\tools\bin
- 新建用户变量
- Flutter 局部环境变量
- 给用户变量
Path
添加%ANDROID_HOME%\platform-tools
- 接着在命令行终端输入
flutter config --android-sdk D:\Develop\Android\Sdk
- 给用户变量
由于 gradle 的默认缓存目录是在 C 盘,所以需要更改到其他位置,新建用户变量GRADLE_USER_HOME
,变量值填入F:\AndroidStudioCache\.gradle
注意
新安装 Android Studio 时,由于 jre 目录的文件不完整,需要把整个 jre 目录删除,然后在软件根目录下执行命令 mklink /D "jre" "jbr"创建一个软链接即可
一些常用的安卓模拟器命令
- 查看安装有哪些安卓模拟器:
emulator -list-avds
- 修改安卓模拟器的 dns 网关地址,实现模拟器联网:
emulator -avd 模拟器名 -dns-server 局域网网关
Dart、fvm、Flutter的安装配置
先去下载Dart
设置安装目录为D:\Develop\Dart
安装完后会自动生成一个系统环境变量DART_SDK
,然后给用户变量Path
添加一个值%DART_SDK%\bin
下载 fvm
dart pub global activate fvm
再给用户变量Path
添加一个值%LOCALAPPDATA%\Pub\Cache\bin
创建一个系统变量FVM_CACHE_PATH
,填入值D:\Develop\fvm
注意
v3版本之前的 fvm 所使用的系统变量名是FVM_HOME
然后使用命令修改 fvm 的缓存路径、禁用git缓存
fvm config --cache-path D:\Develop\fvm
fvm config --no-git-cache false
注意
注意:由于 fvm 是 bat 脚本,需要在 cmd 或 powershell 中才能执行
查看所有可用的 flutter 版本fvm releases
下载安装某个 flutter 版本,这里以 3.13.4 为例:fvm install 3.13.4
设置已下载的某个 flutter 版本作为全局,fvm global 3.13.4
设置了全局版本之后,会在D:\Develop\fvm
目录下自动生成一个default
目录,其将作为软链接指向某个具体的版本
然后给用户变量Path
添加一个值%FVM_CACHE_PATH%\default\bin
最后创建两个用户环境变量FLUTTER_STORAGE_BASE_URL
和PUB_HOSTED_URL
FLUTTER_STORAGE_BASE_URL => https://storage.flutter-io.cn
PUB_HOSTED_URL => https://pub.flutter-io.cn
更多 fvm 命令可以查看官方文档
注意
在运行flutter doctor
进行环境检查时,如果提示 HTTP Host Availability
,则按以下处理:
- 打开
flutter\packages\flutter_tools\lib\src\http_host_validator.dart
文件 - 修改
kPubDevHttpHost
的值为https://pub.flutter-io.cn/
- 修改
kgCloudHttpHost
的值为https://storage.flutter-io.cn/
- 修改
androidRequiredHttpHosts
的值为https://maven.aliyun.com/repository/google/
- 删除
flutter/bin/cache
目录 - 重新运行
flutter doctor
常用的源
- 国内 Flutter 社区
FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn
PUB_HOSTED_URL: https://pub.flutter-io.cn
- 上海交通大学
FLUTTER_STORAGE_BASE_URL: https://mirrors.sjtug.sjtu.edu.cn
PUB_HOSTED_URL: https://dart-pub.mirrors.sjtug.sjtu.edu.cn
- 清华大学 TUNA 协会
FLUTTER_STORAGE_BASE_URL: https://mirrors.tuna.tsinghua.edu.cn/flutter
PUB_HOSTED_URL: https://mirrors.tuna.tsinghua.edu.cn/dart-pub
至此,Dart、fvm 和 flutter 的环境配置结束