MSYS2 笔记

Msys2存在两种shell环境:Msys2和MinGW(32/64)。其中Msys2环境是在win中用映射模拟出一套类linux的API(posix),相当于一层翻译层。mingw则直接编译到win原生接口

以Msys2 64位版本为例:

Msys2的pacman仓库中分别有python2/3和mingw-w64-x86_64-python2/3两个软件包,在两个环境下运行以下代码:

import os
print(os.name)

Msys2下会输出 posix

MinGW下会输出 nt

大多数情况下这个区别不影响使用,重点影响在涉及ctype的程序。根据ctype源码,Python会根据os.name加载WinDLL(PE可执行格式)或CDLL(ELF可执行格式),另外PyDLL不清楚

由于以上原因,Django x IIS不能使用MSYS2的python,但可以使用MinGW的Python;

另外,pacman还托管了部分pip包(包括Django),若先用pip安装过的模块包则pacman无法覆盖安装(可以用–force参数覆盖,风险操作);用pacman安装的包会随着-Syu更新到最新版本,对版本有要求的程序要考虑不使用pacman托管包或者用Python虚拟环境

(在尝试用Msys2的python开发Django网站过程中,发现pip无法编译安装mysqlclient,也无法用whl安装,于是转用PyMySql,并到Django源码中修改了调用…然后在一次pacman -Syu更新一下网站挂了,才想起这茬)


Msys2中lnln -s默认行为是直接把文件复制一份
Msys2启用NTFS软链接(SYMLINK),参考cygwin。(MSYS本质是CYGWIN的分支项目)

编辑/etc/profile,加入以下代码

export MSYS=”winsymlinks:native”

开启后lnln -s在NTFS中就能够实现硬/软链接,但似乎不能实现mklink的创建目录联接(JUNCTION)


若把msys2装在C盘(默认目录c:\msys64\),部分功能需要管理员权限,否则可能损坏。例如:

MinGW下安装nodejs,生成npm命令,
使用npm更新npm时需要CMD环境管理员权限执行

另外更新npm还需将/mingw64/bin/np*全部软连接到/mingw64/lib/node_modules/npm/bin/np*,否则npm报错

似乎是npm的bug想把npm5.6.0更新到6.4.0会丢掉npmlog然后损坏…所以还是别拿npm自己更新,让pacman自己更新nodejs好了…

最后你就知道为什么pacman要缓存一堆软件包等你reinstall


vscode可以使用Msys2的Python,但不能使用Msys2的git,理由是Msys2的git使用的是unix目录格式(斜杠’/’分割),vscode(win)要求使用Windows目录格式(分区符号:目录反斜杠’\’分割)

装git for win不可避免,但事实上git-win也是一个msys2环境,可以考虑手动合并

One Reply to “”

留下评论