转载请注明文章出处:https://itlanyan.com/switch-to-msys2

之前的博文“使用CLion替换Visual Studio”,介绍了配置Cygwin/MSYS2协同CLion进行C++开发的流程。因为CLion的缘故开始尝试使用MSYS2,经过一段时间使用,目前基本已完全替代了Cygwin。

总结半个月的使用体验:

  1. 比Cygwin性能更好的说法,日常使用上没什么感觉(应该是针对CPU密集程序)。个人反而觉得Cygwin使用上更顺滑;
  2. pacman真心好用,秒杀Cygwin的installer安装和更新方式;
  3. 完整的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常用的操作和命令分别如下:

  1. 安装软件:
    pacman -Sy xxxx
    
  2. 搜索软件:
    pacman -Sys xxxx
    
  3. 搜索已安装软件包:
    pacman -Qs xxxx
    
  4. 更新软件:
    pacman -Syu xxx
    

    如果不加软件包,则更新系统中已安装的所有软件。

  5. 卸载软件包:
    pacman -R xxx
    

MSYS2其他配置

PATH变量

MSYS2启动时默认只带上Windows系统的部分PATH变量,大部分Windows已安装的软件不能直接在MSYS2中调用。如果想要访问Windows中系统和用户的PATH环境变量,操作如下:

  1. 通过”MSYS2 MSYS”入口启动MSYS2,在快捷方式中添加”–use-full-path”参数。配置截图如下:
  2. 通过安装目录下的“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编码。解决方法如下:

  1. 安装winpty软件: pacman -Sy winpty;
  2. 在.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的方式来执行程序,使用上可能有略微的不爽。

如果有其他问题,欢迎留言。

参考

  1. https://lug.ustc.edu.cn/wiki/mirrors/help/msys2
  2. https://github.com/Alexpux/MSYS2-packages/issues/249
  3. https://wiki.archlinux.org/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)