虽然 Windows 现在有 WSL,但是使用 Windows 多少感觉还是有点不方便。所以我们倒反天罡,用 Linux 和 msys2 进行一些 Windows 开发。
那么我们用到的主要就是 https://github.com/msys2/msys2-docker 这个镜像。这次我也顺带体验了一下 rootless podman,中间也遇到了一些问题。
它的原理就是运行一个 headless 的 X server 为 wine 服务,同时用一个 patch 过的可以支持 msys2 的 wine 启动 msys2。某种意义上来说,就是 WSL 反过来变成 LSW。传统的 Windows 开发总会有一个工具链的问题必须用 MS 家 cl 那一系列,那有了 msys2 之后,各种 flavor 的 clang 就可以随便使用了,还可以使用 Linux 下熟悉的 cmake / pkgconfig / ninja 等等一系列工具。
具体使用当中遇到了几个问题:
1、rootless podman 需要的 subuid 和 subgid 不足,遇见了“potentially insufficient UIDs or GIDs available in user namespace”这个错误。
Archlinux 和 Wiki 页面默认的文档创建的 UID 和 GID 范围似乎不足运行这个镜像,那我直接加大力度:
usermod --add-subuids 100000-465535 --add-subgids 100000-465535 username
似乎问题就得到解决了。
2、挂载的问题
它这个镜像本身还是一个基底是 debian 再运行 wine 的设定,所以熟悉 wine 的都知道,在系统的根默认是映射到 z 盘的。经过 Linux mount -> wine -> msys2 这样绕过一圈之后。例如你挂载的路径是这样
podman run --mount type=bind,src=/home/username/Develop,target=/code -it ...
那么你想要找到这个 /code 那 msys2 内对应的路径就变成了 /z/code。
3、更新的问题
在 msys2 内运行 pacman -Syu 可能会发现,因为更新了基础系统包(filesystem / pacman)会重新启动 msys2。可这样容器就退出了。其实也不需要担心,只需要重启容器(而不是重新从镜像启动容器)即可。当然你也可以直接去 build 一个更加新的镜像自己使用。
4、性能问题
目前来说,编译性能是很好的,但是 pacman 更新则有很大的问题。因为一些原因这个容器把签名认证给禁用了,但是似乎依然可能在更新到某些包的时候卡住,这时主要还是耐心等待即可。
5、能否用 vscode 和 devcontainer?
其实这个是我自己最关心的一个问题。我的想要解决的问题是,vscode 的代码补全没法针对这个 wine 容器中的 windows 进行。开发上虽然可以进行编译,但是缺少 Windows 方面的补全还是不太方便。
目前来说,我暂时没有找到解决方案。我尝试了多种方法,但最后都卡在 vscode 对于镜像本身的使用上。虽然没有成功,不过也把这个我尝试的方案都列举一下。
a) 直接启动容器
这个的问题是 vscode 直接指定了容器的 Linux 部分进行探测,虽然能够成功安装 vscode 的 server 部分,但是于解决我的代码补全无益。即使我尝试 override vscode 的命令部分也会看到它去运行 /bin/sh 。最终还是不成功。
b) 在 msys2 里运行 ssh
我思考,因为我的问题是它启动之后直接去运行 Linux 本身的部分,那我用套 ssh 的方式强制启动 msys2 是否可行?结果我就卡在了 msys2 启动 ssh 上。虽然可以安装,但是通过我小小的搜索,运行 msys2 的 ssh 因为 ssh 本身需要鉴权,所以还要搞一些什么 mkpasswd 注册系统服务的麻烦事。最终我也没有成功运行 wine 的 msys2 内的 ssh。套娃太多确实中间哪一步出现问题都很正常。
c) 在 Linux 内运行 ssh 启动 msys2
它的基底 Linux 是一个普通的 debian,所以运行 debian 上的 ssh 反而要比再套了 wine 和 msys2 的要容易得多。这里我还是取得了少部分的成功的。只需要最后用一些方法强行在 ssh 登录之后启动 msys2 就可以 ssh 一步进入 msys2 了。但我发现我想多了,后面 vscode 明显就开始进行一些水土不服的操作。我本来是想你在 msys2 内部,执行类 Linux 的初始化。但明显 vscode 探测到这是一个 Windows 系统之后,反手就是一个 powershell。而 wine 的 powershell 是没有实现的空壳 exe。除此之外还有 vscode 的挂载路径和 wine 内路径不统一的问题。到这里我还是决定放弃这个想法,能编译已经不错了,要啥自行车。