体验MSYS2 - 在Windows上体验Unix终端和软件
免责声明
有部分内容是机翻的,想看省流版本的去到结尾
写在前面
因为最近闲的没事干,笔者准备写个小脚本来爬蔚蓝档案吧的二创贴,顺便做个监控和排名。但是,当笔者准备打开命令行,新建虚拟环境的时候,发现copy出来的是3.11.7
,如果我没记错的话,我的python
是跟着winget
更新的,最新的应该是3.12.1
,虽然就一个小小的版本的区别,我就很奇怪了,在命令行里面where python
1 | where python |
这就有点意思了,msys2
里也装了一个,但我印象里面我也没用过msys2
装过python
啊,合着上次装工具链的时候一起装的?不过我之前一直用另一台电脑,还真没留意这个东西。
这不是什么大的问题,真正的问题是,Windows下面的环境变量管理实在是逆天,别的系统都是用户配置优先的,到了Windows就是反过来的,系统配置优先?我TM,用户配置里面,我自己装的在msys2
的上面,但是,系统配置里面是没有我自己装的,这就引发出个问题,我到底是把用户目录下面的加到系统配置里面呢?还是把python
拷贝到其他地方去?如果是第一种方案,就会导致环境配置混乱,第二种方案,不方便更新。可见,Windows下面的运行环境简直就是依托答辩,各种东西到处乱飞。
因为笔者主要还是使用Linux较多,所以决定看看msys2
好不好用,看看能不能替代其他玩意作为包管理器和管理运行环境。
简介
msys2
的官方网站上面说的很明白,Windows上的软件分发和构建平台,包含了很多的库和工具,有一个bash终端
,和arch一样的pacman
包管理器,一些从cygwin
项目移植过来的unix工具,还有很多基于Windows的原生预构建软件包,包括了常用的运行环境和工具。
当然,笔者认为以上这对废话初学者大概率都看不懂,简而言之,msys2项目就是让很多的unix软件可以在Windows上运行,或者说将unix软件移植到windows上,并且让你在命令行里面可以用unix的习惯写命令。
安装
翻译并精简自官方文档
- 下载 安装包 msys2-x86_64-20240113.exe (系统需要64位 版本8.1以上)
这里笔者要提一嘴,这个安装包是写这篇文章时官方给出的最新的,如果以后官方更新了,你用旧的安装包也是没有问题的,在安装完之后可以手动对核心组件进行更新,而且每次检查更新时都会更新核心组件。 - 双击运行安装,然后全部默认,下一步,直到完成。
- 现在msys2已经准备就绪,并且会启动一个
ucrt64环境
的终端。 - 现在你就可以安装各种工具比如
mingw-w64 gcc
来编译项目,我们来尝试一下。- 输入以下命令安装gcc
1
$ pacman -S mingw-w64-ucrt-x86_64-gcc
- 终端会显示以下内容,按下
回车键
或者输入y后回车
表示继续安装1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20resolving dependencies...
looking for conflicting packages...
Packages (15) mingw-w64-ucrt-x86_64-binutils-2.41-2
mingw-w64-ucrt-x86_64-crt-git-11.0.0.r216.gffe883434-1
mingw-w64-ucrt-x86_64-gcc-libs-13.2.0-2 mingw-w64-ucrt-x86_64-gmp-6.3.0-2
mingw-w64-ucrt-x86_64-headers-git-11.0.0.r216.gffe883434-1
mingw-w64-ucrt-x86_64-isl-0.26-1 mingw-w64-ucrt-x86_64-libiconv-1.17-3
mingw-w64-ucrt-x86_64-libwinpthread-git-11.0.0.r216.gffe883434-1
mingw-w64-ucrt-x86_64-mpc-1.3.1-2 mingw-w64-ucrt-x86_64-mpfr-4.2.1-2
mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-4
mingw-w64-ucrt-x86_64-winpthreads-git-11.0.0.r216.gffe883434-1
mingw-w64-ucrt-x86_64-zlib-1.3-1 mingw-w64-ucrt-x86_64-zstd-1.5.5-1
mingw-w64-ucrt-x86_64-gcc-13.2.0-2
Total Download Size: 49.38 MiB
Total Installed Size: 418.82 MiB
:: Proceed with installation? [Y/n]
[... downloading and installation continues ...] - 我们来测试一下
gcc
1
2$ gcc --version
gcc.exe (Rev2, Built by MSYS2 project) 13.2.0
- 输入以下命令安装gcc
环境
笔者认为官方文档中,这一篇比较重要,关系到很多东西。
msys2
具有很多不同的环境
(笔者注:指命令行环境
),所以首先你要做的就是选择使用哪一个。不同的环境之间的区别主要是环境变量
,默认的编译器/连接器
,处理器架构
,使用的系统库
等等。如果你不确定使用什么,用ucrt64
准没错。
补充
你在应用程序
里会看到这几个玩意。
你点进去就会打开一个终端窗口
,粉红色
的字就是当前的环境。
MSYS 环境
包含基于类 unix/cygwin
的工具,位于 /usr
下,其特殊之处在于它始终处于活动状态。所有其他环境都继承自 MSYS 环境
,并在其之上添加各种内容。
例如,在 UCRT64
环境中,$PATH
变量以 /ucrt64/bin:/usr/bin
开头,因此您可以获得所有基于 ucrt64
的工具以及所有 msys
工具。
概览
GCC 还是 LLVM/Clang
这些是用在相应存储库中构建所有包的默认编译器/工具链。
基于GCC
的环境:
- 目前已广泛测试/使用
Fortran
支持- 虽然
MINGW
环境中也存在Clang
包,但该包仍然使用GNU 链接器
和GNU C++ 库
。在某些情况下,Clang
也用于构建软件包,例如,上游更喜欢Clang
而不是GCC
。
基于LLVM/Clang
的环境:
- 仅使用
LLVM
工具,LLD
作为链接器,LIBC++
作为C++标准库 Clang
提供 ASAN 支持- 对
TLS
(线程本地存储)的本机支持 LLD
比LD
更快,但不支持LD
支持的所有功能- 某些工具缺乏与等效 GNU 工具相同的功能
- 支持
Microsoft Windows 10
上的ARM64/AArch64
架构
MSVCRT 还是 UCRT
这是 Microsoft Windows
上 C 标准库
的两个变体。
MSVCRT
(Microsoft Visual C++ Runtime)默认在所有 Microsoft Windows
版本上可用,但由于向后兼容性问题一直停留在过去,不兼容 C99 并且缺少一些功能。
- 它不兼容
C99
,例如printf()
函数系列,但是…… mingw-w64
提供了替换函数,使其在很多情况下兼容 C99- 它不支持
UTF-8
区域设置 - 与
MSVCRT
链接的二进制文件不应与UCRT
链接的二进制文件混合,因为内部结构和数据类型不同。(更严格地说,为不同目标构建的对象文件或静态库不应混合。为不同 CRT 构建的 DLL 可以混合,只要它们不共享CRT
对象,例如FILE*
跨DLL 边界
。)同样的规则适用于MSVC
编译二进制文件,因为MSVC
默认使用UCRT
(如果不更改)。 - 可在
Microsoft Windows
的每个版本上开箱即用。
UCRT
(通用 C 运行时)是一个较新的版本,Microsoft Visual Studio
也默认使用它。它的工作和行为应该就像代码是用 MSVC
编译的一样。
- 在构建时和运行时比
MSVC
具有更好的兼容性。 - 它作为
Windows 10
或更高版本以及Windows Server 2016
或更高版本中操作系统的一部分包含在内。对于较旧的 Windows 版本,您必须明确提供它或取决于安装它的用户。有关这方面的更多信息,请参阅UCRT 部署。
添加到终端
因为笔者只有Windows Terminal
,所以只有这个的步骤。
- 打开
终端
,在下拉选项卡里找到设置
。 - 左下角
打开json文件
。 - 在json文件里找到
"profiles"
这一行,把配置加到后面补充:
把大括号里面的内容加进去就行。
字体和大小可以在设置
里面调,比较直观。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"profiles": {
"list":
[
// ...
{
"name": "UCRT64 / MSYS2",
"commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64",
"startingDirectory": "C:/msys64/home/%USERNAME%",
"icon": "C:/msys64/ucrt64.ico",
"font":
{
"face": "Lucida Console",
"size": 12
}
},
{
"name": "MSYS / MSYS2",
"commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys",
"startingDirectory": "C:/msys64/home/%USERNAME%",
"icon": "C:/msys64/msys2.ico",
"font":
{
"face": "Lucida Console",
"size": 12
}
},
// ...
]
}
添加到 IDE
因为笔者只用 VS Code,所以只有这个的。
- 在VS Code的
设置
里找到下图的位置。 - 参考下图把这段加进去。
1
2
3
4
5
6
7
8
9
10
11{
"terminal.integrated.profiles.windows": {
"MSYS2 UCRT": {
"path": "cmd.exe",
"args": [
"/c",
"C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
]
}
}
}
包管理
基本的操作和arch上的pacman一样,直接去参考就行。
包名
所有的包都会有一个代表环境的前缀
使用pacboy进行高级搜索
- 安装pactoys
1
$ pacman -S pactoys
- 使用
:p
来指定环境,例如具体的后缀可以使用1
$ pacboy -S x265:u
pacboy help
查看
仓库镜像
笔者查看了配置文件,个人感觉不需要进行干预,因为里面的镜像网站很齐全。
Git 的问题
笔者参考了官方的文档后,msys2中,git目前只提供了cygwin的版本,只能支持标准的的unix路径,而且与Git for Windows
相比,性能很差,尤其是大型仓库。官方在积极解决这个问题。
环境变量
这里先说结论,外面可以读到msys2安装的环境,msys2不能读外面的,很正常,比较设计就是这样的。
尾巴
因为众所周知的原因,Windows就是一个以图形化界面为主的系统。基本没什么人用它的命令行,因为所有工作都可以在图形化界面完成。而Linux不一样,它可以在没有图形化环境的情况下正常使用。然后由于众所周知的原因Linux的桌面环境很难用。你说苹果吧,图形化确实有,命令行确实有,就是没有软件支持。最近个人用得比较舒服的就是Chromebook,可以开Linux虚拟机,图形化界面也处理的好。
MSYS2这个项目一开始给我一种很神奇的感觉,首先它这个移植就很离谱,基本部分是基于cygwin。cygwin这个东西很有意思,用一个动态链接库来处理与POSIX系统调用和环境有关的东西,简单来说就是一个API兼容层。兼容层这个东西会影响一点效率,从Git就可以看出来。所以,MSYS2还包括了一系列的原生构建的软件包,真,从源码构建,直接使用Windows API。MSYS2用Pacman作为包管理器,终于解决了Windows上面没有一个像样的包管理器的问题,各种环境终于不是东一个西一个,还附带了一点滚动更新的优点。自带的bash终端就很有Linux的感觉, 要是你愿意,甚至可以用nano来编辑文件,而且终于不用使用逆天的反斜线写路径了。