0. 前言
最近在折腾Windows下的开发环境,发现MSYS2是一个非常强大的工具,十分适合我这种喜欢极致轻量化的人
做此记录,以便日后查阅
主要优势:
- 轻量化(相比臃肿的MSVC)
- Unix工具链的Windows实现
- 完善的包管理系统
1. 安装MSYS2
环境选择
- MSYS2 提供了不同的环境,这些环境之间的主要区别在于工具链和实现。如果不确定使用哪个,请选择 UCRT64:
Name |
Prefix |
Toolchain |
Architecture |
C Library |
C++ Library |
MSYS |
/usr |
gcc |
x86_64 |
cygwin |
libstdc++ |
UCRT64 |
/ucrt64 |
gcc |
x86_64 |
ucrt |
libstdc++ |
CLANG64 |
/clang64 |
llvm |
x86_64 |
ucrt |
libc++ |
CLANGARM64 |
/clangarm64 |
llvm |
aarch64 |
ucrt |
libc++ |
MINGW64 |
/mingw64 |
gcc |
x86_64 |
msvcrt |
libstdc++ |
Note:
路径说明:
安装路径示例:C:\msys2\ucrt64
软件安装路径:对应环境的bin
目录,例如:C:\msys2\ucrt64\bin
安装基本编译器:
1 2 3 4 5 6 7
| sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
pacman -Syu pacman -S pactoys pacboy -S toolchain zsh pacman -S git
|
Note:
- pactoys 是MSYS2提供的软件包管理工具,它功能与pacman基本相同,但是它可以直接安装对应环境的软件包,例如:UCRT64环境下
pacboy -S gcc
等价于pacman -S mingw-w64-ucrt-x86_64-gcc
。
2. 配置环境变量
环境变量注意:
Windows Terminal配置
替代方案详见Step.7
- 在 Windows Terminal 的配置文件中,添加如下内容:
1 2 3 4 5 6 7 8 9 10 11
| "list": [ { "commandline": "C:\\msys2\\msys2_shell.cmd -defterm -here -no-start -ucrt64 -shell zsh", "guid": "{fd57d26d-d3d0-448a-8bd5-e44632685d72}", "hidden": false, "icon": "C:\\msys2\\ucrt64.ico", "name": "MSYS2 UCRT64", "startingDirectory": "C:\\msys2\\home\\%USERNAME%" } ]
|
Note:
- 如果你不使用zsh,可以将
-shell zsh
修改为-shell bash
等。
- 你也可以在GUI中添加,以上参数分别对应:
参数 |
说明 |
commandline |
命令行 |
icon |
图标 |
name |
名称 |
startingDirectory |
启动目录 |
- 有关zsh的相关配置,这里不再赘述
3. 配置开发环境
vscode 必备插件:
- C/C++
- C/C++ Extensions
- CMake Tools
- Code Runner
C++插件配置(.vscode/c_cpp_properties.json)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "C:/msys2/ucrt64/include/**" ], "defines": [], "compilerPath": "C:/msys2/ucrt64/bin/gcc.exe", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "gcc-x64" } ], "version": 4 }
|
vscode 必备插件:
- Clangd
- Cmake Tools
- Code Runner
配置clangd与coderunner,在settings.json中添加如下内容:
1 2 3 4 5 6 7
| { "clangd.path": "C:\\msys2\\clang64\\bin\\clangd.exe", "code-runner.executorMap": { "c": "cd $dir && clang $fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt", "cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt" } }
|
这部分内容算是提供一种思路 实际上我不太习惯neovim,所以没有深入研究(*/ω\*)
- 在msys2中安装neovim:
- 配置LazyVim:
1 2 3 4
| git clone https://github.com/LazyVim/starter $env:LOCALAPPDATA\nvim Remove-Item $env:LOCALAPPDATA\nvim\.git -Recurse -Force
nvim
|
等待安装即可
- 配置基本语言服务器:
- 在Neovim中,按下
<Space>cm
,打开Mason
- 选择
clangd
,按下i
安装
推荐阅读
Dusty Phillips的模态编辑书籍:LazyVim for Ambitious Developers
4. Qt环境
1 2 3 4 5
| pacboy -S qt-creator pacboy -S qt6
pacboy -S qt6-static
|
- 在 PowerShell或MSYS2 中,运行以下命令,启动Qt Creator:
5. Node.js环境
使用nvm管理Node.js版本
1 2 3 4 5 6
| nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/
nvm install lts
nvm use lts
|
关于配置文件详见:nvm wiki
6. Python环境
使用MiniConda管理Python版本
1 2 3 4 5 6 7
| conda create -n myenv python=3.8 conda activate myenv conda deactivate conda install numpy conda remove numpy conda env list conda env remove -n myenv
|
7. Powershell增强
- 提示符美化
- PSReadLine
- 实用工具别名
- 常用别名:’which’、’pnpmAL’、’pnpmALG’
- Conda环境管理:’MiniConda’、’condaA’、’condaD’
- MSYS2快捷启动:’msys2’
- Eza用作ls,并沿用Linux使用习惯
- 若不想使用Eza,请将 Eza Function(行73到末尾) 部分删除
- 详细配置文件(记得替换Conda和Msys2路径):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\montys.omp.json" | Invoke-Expression
Set-Alias -Name 'which' -Value 'Get-Command'
Set-PSReadLineOption -PredictionSource History Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward() [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine() } Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward() [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine() }
Function pnpmAL { pnpm approve-builds } Function pnpmALG { pnpm approve-builds --global }
Function Exf { param( [Parameter(Mandatory = $false)] [string]$Path ) if ($Path) { explorer $Path } else { explorer . } }
Function MiniConda { param( [Parameter(Mandatory = $false)] [string]$EnvName ) & 'D:\MiniConda\shell\condabin\conda-hook.ps1' conda activate 'D:\MiniConda' if ($EnvName) { conda activate $EnvName } }
Function condaA { param( [Parameter(Mandatory = $true)] [string]$EnvName ) conda activate $EnvName }
Function condaD { param( [Parameter(Mandatory = $false)] [string]$EnvName ) if ($EnvName) { conda deactivate $EnvName } else { conda deactivate } }
Function Msys2 { & 'D:\MSYS2\msys2_shell.cmd' -defterm -no-start -clang64 -shell zsh }
$eza_params = @( '--git', '--icons', '--group', '--group-directories-first', '--time-style=long-iso', '--color-scale=all' )
Function ezals { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza ($eza_params + $EParams) }
Set-Alias -Name 'ls' -Value 'ezals'
Function l { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza --git-ignore ($eza_params + $EParams) }
Function ll { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza --all --header --long ($eza_params + $EParams) }
Function llm { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza --all --header --long --sort=modified ($eza_params + $EParams) }
Function la { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza -lbhHigUmuSa ($eza_params + $EParams) }
Function lx { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza -lbhHigUmuSa@ ($eza_params + $EParams) }
Function lt { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza --tree ($eza_params + $EParams) }
Function tree { param( [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)] [string[]]$EParams = @() ) eza --tree ($eza_params + $EParams) }
|
8. 结语
完成后,你将获得:
- ✅ MSYS2
- ✅ C/C++
- ✅ Qt
- ✅ Node.js
- ✅ Python
记录完