转载请注明文章出处:https://itlanyan.com/switch-to-msys2
之前的博文“使用CLion替换Visual Studio”,介绍了配置Cygwin/MSYS2协同CLion进行C++开发的流程。因为CLion的缘故开始尝试使用MSYS2,经过一段时间使用,目前基本已完全替代了Cygwin。
总结半个月的使用体验:
- 比Cygwin性能更好的说法,日常使用上没什么感觉(应该是针对CPU密集程序)。个人反而觉得Cygwin使用上更顺滑;
- pacman真心好用,秒杀Cygwin的installer安装和更新方式;
- 完整的Windows原生应用构建工具链支持。
如果你已经在使用Cygwin,迁移到MSYS2的必要性取决于2和3是否重要;如果你正在在使用MSYS2,似乎没有迁移到Cygwin的必要,除了Cygwin更像Linux;如果你未使用过两者中的任何一个,建议尝试MSYS2。总体来说,MSYS2比Cygwin稍好,但好处不是那么明显,毕竟MSYS2是Cygwin的fork版本。
接下来谈谈MSYS2的安装和配置。
安装MSYS2
不同于Cygwin,安装MSYS2和安装普通的软件没有区别。从官网(https://www.msys2.org/)下载最新版的安装包,双击运行安装程序即可。建议将MSYS2安装到非系统盘的某个文件夹内,例如“D:\MSYS2”,即使重装系统,MSYS2内的文件和程序依然可以正常使用。
使用pacman安装和管理软件
pacman是ArchLinux的包管理工具,MSYS2使用其管理程序包。安装软件之前,建议先配置pacman使用中科大源(或者清华源),加快软件包的下载速度。操作如下:
编辑
/etc/pacman.d/mirrorlist.mingw32
,在文件开头添加:Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
编辑
/etc/pacman.d/mirrorlist.mingw64
,在文件开头添加:Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
编辑
/etc/pacman.d/mirrorlist.msys
,在文件开头添加:Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
然后执行 pacman -Sy 刷新软件包数据。
配置好速度快的安装源后,就可以开始安装软件了。例如安装必备的vim、tmux、openssh工具:
pacman -Sy vim tmux openssh
pacman常用的操作和命令分别如下:
- 安装软件:
pacman -Sy xxxx
- 搜索软件:
pacman -Sys xxxx
- 搜索已安装软件包:
pacman -Qs xxxx
- 更新软件:
pacman -Syu xxx
如果不加软件包,则更新系统中已安装的所有软件。
- 卸载软件包:
pacman -R xxx
MSYS2其他配置
PATH变量
MSYS2启动时默认只带上Windows系统的部分PATH变量,大部分Windows已安装的软件不能直接在MSYS2中调用。如果想要访问Windows中系统和用户的PATH环境变量,操作如下:
- 通过”MSYS2 MSYS”入口启动MSYS2,在快捷方式中添加”–use-full-path”参数。配置截图如下:
- 通过安装目录下的“mingw32.exe”,”mingw64.exe”或者”msys2.exe”启动MSYS2,在对应的配置文件中启用如下行:
msys2.exe对应的启动配置文件msys2.ini
MSYS2_PATH_TYPE=inherit
设置好后重新打开MSYS2,输入“echo $PATH”打印变量,典型的输出如下:
/usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/WINDOWS/System32/OpenSSH:/c/Program Files (x86)/GtkSharp/2.12/bin:/c/Program Files/nodejs:/c/ProgramData/ComposerSetup/bin:/c/Program Files (x86)/Yarn/bin:/c/Users/tlanyan/AppData/Local/Programs/Python/Python37-32/Scripts:/c/Users/tlanyan/AppData/Local/Programs/Python/Python37-32:/c/Program Files/Microsoft VS Code/bin:/c/Users/tlanyan/AppData/Local/Microsoft/WindowsApps:/c/Users/tlanyan/AppData/Local/Programs/Fiddler:/c/Users/tlanyan/AppData/Local/Microsoft/WindowsApps:/c/Users/tlanyan/AppData/Roaming/npm:/c/Users/tlanyan/AppData/Roaming/Composer/vendor/bin:/d/Program Files/nginx-1.14.0:/c/Program Files (x86)/Windows Kits/8.1/bin/x86:/d/Program Files/php-7.2.7-Win32-VC15-x64:/c/Users/tlanyan/AppData/Local/Programs/Microsoft VS Code/bin:/c/Users/tlanyan/AppData/Local/Yarn/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
ping等命令乱码
MSYS2中使用ping等部分命令,中文输出是乱码或者不显示,原因是Windows使用GBK编码,而MSYS2终端默认使用Unicode编码。解决方法如下:
- 安装winpty软件: pacman -Sy winpty;
- 在.bashrc或者.zshrc等shell配置文件加入以下别名:
alias ping="/bin/winpty ping" alias netstat="/bin/winpty netstat" alias nslookup="/bin/winpty nslookup" alias php="/bin/winpty php"
设置好后重新打开MSYS2窗口,ping、netstat这些命令的输出就正常了。
注意:如果你右键MSYS2窗口,在“text(文本)”设置中将“Character Set(字符集)”直接改成GBK,会导致其他命令输出不正常。推荐的做法是如上使用winpty命令包装以GBK编码输出中文字符的命令。
符号链接
MSYS2不能使用ln命令创建符号链接,运行ln命令创建符号链接的结果是创建目标的硬链接(即将文件复制过来),官方对此的解释是只能使用Windows原生的符号链接行为,所以ln的运行方式正确。
所以要想创建符号链接,该怎么做呢?一种做法是使用Windows原生的mklink命令:以管理员身份打开cmd,然后执行mklink。mklink命令在MSYS2中不可用,所以不想在丑陋的cmd界面执行创建符号链接的另一种做法是使用winln软件包替代。但美中不足,winln命令依然需要管理员权限才能正确运行。
总结
在MSYS2中,你总能方便的用上最新的软件包(更新比Cygwin快),且支持原生的Windows应用开发。相对于Cygwin,这两点十分诱人。但是与Cygwin不同,MSYS2更倾向于用Windows的方式来执行程序,使用上可能有略微的不爽。
如果有其他问题,欢迎留言。
发表回复