# 我是怎么在 Mac 上开发 Mole for Windows 的

Mole for Mac 发布以后，一直有不少小伙伴问什么时候出 Windows 版，当时给大伙的答复是等 Mac 完善以后才有空来弄，10 月 14 日 Windows 版终于上线了。上线之前其实已经在小范围里迭代了 20 多个版本，又经过 Mole 天使用户多天内测，大家提了非常多的建议，非常感谢大伙帮忙，这一次的开发挺有意思的，记录一下我是怎么在 Mac 上把它做出来的。

<figure class="blog-diagram">
  <img src="/img/windows/clean.webp" width="2584" height="1741" loading="lazy" alt="Mole for Windows 的清理页，顶部是五个页面的导航，中间是地球">
</figure>

## 几乎从零开始

为了更好的使用体验和性能，这次用的是 Windows 原生的 C# 和 WinUI 3，没有套 Electron，加上 Windows 和 Mac 的系统特性、要清理的东西完全不一样，除了设计和文案，Mac 版十几万行 Swift 几乎没有可以复用的代码，来来回回差不多写了一个月，大概 7.8 万行代码和 4000 多个测试用例。

## 一台 Mac，一台虚拟机，一台 ThinkPad

开发和调试的难度也远大于熟悉的 Mac，WinUI 的界面在 Mac 上编译不了，我的做法是代码编写和 AI 上下文都留在 Mac 这一台机器上，Mac 上装 Parallels Desktop 开一台 Windows 虚拟机做调试验证，再整一台 ThinkPad X1 让它 24 小时开着，看虚拟机里看不到的真实效果。这是我现在的工作台，中间是 Mac，左边是 ThinkPad X1，几块屏上开着的都是 Mole。

<figure class="blog-diagram">
  <img src="/img/windows/workspace.webp" width="1600" height="1200" loading="lazy" alt="作者的工作台，中间是 Mac 和外接显示器，左边是 ThinkPad X1，屏幕上开着的都是 Mole">
</figure>

## 几个好用的做法

用 Mac 开发 Windows 软件这一个月，有几个做法感觉挺好用，分享给有同样需求的小伙伴：

- 代码分层，清理、卸载这些核心逻辑和界面状态放在不依赖 Windows 的 .NET 工程里，调用系统接口的那一层开了 `EnableWindowsTargeting`，在 Mac 上也能编译，4000 多个测试大部分在 Mac 上就能跑，只有 WinUI 界面这一层必须去 Windows 里编译。
- 仓库直接作为 Parallels 的共享文件夹挂到虚拟机里，Mac 上改完代码，虚拟机里直接编译运行，不用来回拷，两边的编译产物要分到不同目录，不然 `obj` 里记的绝对路径会来回打架。
- 虚拟机用脚本来驱动，`prlctl exec` 在里面执行命令，再按控件的无障碍名字（UI Automation）去点按钮、截窗口，AI 不靠坐标也能准确点中，界面稍微变动也不会点偏。
- ThinkPad 通过 UU 远程和 ssh 连过去，真实的 x64、高分屏缩放、电池、SmartScreen 和 Defender 这些都在它上面看，每次发版前都要在它上面装一遍、点一遍。
- 实在没有命令行能走的地方，在 Claude 里通过 lcu 让它去调用 Codex 的 computer use，有一说一 Codex 的 computer use 是真的好用，不过 UAC 弹窗它是点不动的，这时候还得我自己上，哈哈。

平时一般是 Kaku 里面 7 到 10 个 Tab 的 Agent 同时在跑任务。

## Windows 开发者证书很麻烦

Windows 上没签名的安装包，一打开就会被「Windows 已保护你的电脑」拦住，Windows 11 的智能应用控制更是直接不让运行，所以发布前我得先买一张代码签名证书。查的时候发现 EV 证书现在对 SmartScreen 已经没有加成，签了名的新程序一样要等装的人多了才不再提示无法识别，微软自己的 Azure Artifact Signing 一个月不到 10 美元最省事，可惜个人只开放给美国和加拿大，我用不上，Certum 便宜的开源证书又不允许商用。

最后买的是 Certum 的云端 OV 证书，一年一两百美元，密钥放在它的云端 HSM 里，签名时用手机上的 SimplySign 给一个动态码，证书上的名字是审核过的法定名称，SmartScreen 的信誉也跟着这个名字积累。用下来遇到过几次 SimplySign 的会话闲置几个小时后断开，打包到一半才报签名失败，后来我每次打包前都先试签一个文件。

## 花时间最多的是测软件

清理工具最怕删错东西，Windows 上每个软件的安装器和卸载器又各有各的写法，只能一款款装上去试。我按国内外工程师常用的列了一份名单，编辑器、IDE、浏览器、聊天、网盘、数据库、AI 工具都有，每一款装上、打开用一下，再看 Mole 的卸载、更新、残留清理和启动项认不认得它，到现在实测了 372 款，其中 72 款测出了问题，都是当轮修掉、补上测试再重测。有的问题还是我自己的环境带出来的，VS Code 第一次测就把 Parallels 给 Mac 版 VS Code 建的同名快捷方式也当成了它的残留，差点误伤。

<figure class="blog-diagram">
  <img src="/img/windows/uninstall.webp" width="2584" height="1741" loading="lazy" alt="Mole for Windows 的软件页，列出已安装的软件和各自的大小">
</figure>

功能上和 Mac 版基本一致，清理、软件卸载与更新、优化、空间分析、状态五个页面，加上托盘面板、屏幕常亮和清洁屏幕，支持 Windows 10 22H2 和 Windows 11，x64 和 ARM64 都有原生安装包。

## 还有一个命令行版

除了桌面版，Mole 的 Windows 命令行版其实年初就开始做了，最早是一位印度开发者提的需求，还顺手给我提了 PR，非常感谢，到现在 9 个半月发了 9 个版本，最近一个月我也在密集迭代，用法和体验基本和 Mac 的命令行版对齐了，开源免费，喜欢命令行的小伙伴可以直接去 [GitHub](https://github.com/tw93/Mole/tree/windows) 上用，它和桌面版的区别可以看[这一篇](/zh/windows/blog/mole-cli-vs-windows-app)。

<figure class="blog-diagram">
  <img src="/img/windows/cli-menu.webp" width="1814" height="741" loading="lazy" alt="PowerShell 里的 Mole CLI for Windows 主菜单，列出清理、卸载、优化、分析和状态">
</figure>

桌面版的下载和价格在 [mole.fit/windows](/windows)，每个功能都可以先免费用两次再决定，欢迎有 Windows 电脑的小伙伴试试。


Canonical: https://mole.fit/zh/windows/blog/building-mole-for-windows-on-a-mac
