在 Mac 或 Linux 上制作 Windows 安装程序
在 macOS 或 Linux 上开发时生成 Setup.exe 的各种方案,从交叉编译 NSIS 到纯浏览器构建,以及如何在没有 Windows 电脑的情况下测试结果。
更新于 2026年10月31日 · 阅读约 4 分钟
很多 Windows 应用是在 Mac 上开发的:Electron 和 Tauri 应用、Python 工具、游戏、交叉编译的 Go 和 Rust 二进制文件。应用本身构建得很顺利,卡住的地方是安装程序,因为传统的安装程序工具都默认你有一台 Windows 机器。下面介绍绕过这一限制的几种方法,以及手头没有 Windows 时如何测试安装程序。
方案一:在浏览器中构建安装程序
ExeTup 在云端构建 Setup.exe。在 Mac 或 Linux 桌面上:
- 生成应用的 Windows 版本,使一个文件夹中包含
MyApp.exe及其文件。Electron Packager、PyInstaller(需在 Windows 或 Windows 虚拟机中运行,因为 PyInstaller 不支持交叉编译)、GOOS=windows go build、cargo build --target x86_64-pc-windows-gnu等都能产出这样的文件夹。 - 将文件夹压缩为 .zip 并上传。
- 填写名称、版本、发布者、安装范围、快捷方式和语言。添加一个
.ico。 - 构建并下载
Setup.exe。
你的机器上不会安装任何东西,也不需要写脚本。各选项的详细说明见如何制作 Setup.exe。
方案二:在本地编译 NSIS
NSIS 的编译器可以在 macOS 和 Linux 上运行:
brew install makensis # macOS
sudo apt install nsis # Debian, Ubuntu
makensis installer.nsi
.nsi 脚本需要你自己编写(具体涉及什么,见在线 NSIS 安装程序)。它生成的安装程序与在 Windows 上编译的完全相同。如果你希望构建完全在自己的 CI 中进行,并且愿意维护脚本,这是正确的选择。
方案三:在 Wine 下运行 Inno Setup
Inno Setup 只有 Windows 版本,但它的编译器可以在 Wine 下运行。安装 Wine,在其中运行 Inno Setup 的安装程序,然后在构建脚本中通过 Wine 调用 ISCC.exe。这种方式可行,也有一些项目就是这样发布的;但在路径和字体方面会遇到一点麻烦。对比请见 Inno Setup 替代方案。
方案四:在 CI 中进行 Windows 构建
GitHub Actions、GitLab 和 Azure Pipelines 都提供 Windows 运行器。在那里构建应用和安装程序,通过一个准备步骤安装 NSIS 或 Inno Setup,然后下载产物。适合有发布流水线的团队;对于发布小工具的独立开发者来说过于繁重。
在 Mac 上制作 .ico
Windows 图标是包含多种尺寸的 .ico 文件。从一张 256×256 的 PNG 开始:
brew install imagemagick
magick icon.png -define icon:auto-resize=256,128,64,48,32,16 icon.ico
应用二进制文件(Electron Packager 的 --icon、PyInstaller 的 --icon)和安装程序使用同一个文件。
没有 Windows 电脑时如何测试
发布前至少应该运行一次安装程序。可选方案大致按所需精力排序:
- Windows 虚拟机。 在 Apple silicon 上,UTM 或 Parallels 搭配 Windows 11 ARM 通过模拟运行 x64 应用,足以测试安装。VirtualBox 和 VMware 可在 Intel Mac 和 Linux 上使用。Microsoft 的许可允许出于测试目的进行评估版安装。
- 云端 Windows 桌面。 Windows 365、Azure Virtual Desktop 或任何供应商按小时计费的 Windows 虚拟机。
- 同事或客户的机器,用于最终检查:运行安装程序,从开始菜单打开应用,再从 Windows 设置中卸载。
macOS 上的 Wine 可以运行部分 Windows 应用,但不是评判安装程序的可靠方式。
常见问题
可以在 Mac 上构建 Windows 应用本身吗?
通常可以。Electron、Tauri、Go、Rust 和 .NET 都能在 macOS 上以 Windows 为目标构建。PyInstaller 不能交叉编译,所以请在 Windows 或 Windows 虚拟机中冻结 Python 应用,然后用它生成的文件夹构建安装程序。
使用 ExeTup 需要 Wine 或虚拟机吗?
不需要。构建在云端运行,结果在浏览器中下载。虚拟机只在之后测试安装程序时才有用。
在 Mac 上编译的安装程序在 Windows 上会表现不同吗?
不会。在 macOS 上用 makensis 编译的 NSIS 安装程序与在 Windows 上编译的逐字节等价,ExeTup 的云端构建使用的也是同一个编译器。
如何在 Mac 上给安装程序签名?
用 signtool 进行代码签名需要 Windows,但 osslsigncode 可以在 macOS 和 Linux 上用同一张证书为 Windows 可执行文件签名。签名为什么重要,见 SmartScreen 指南。
相关指南
- 如何为 Windows 应用制作 Setup.exe(无需编写代码)了解 Setup.exe 实际做了什么、制作安装程序的三种方式,以及如何无需编写安装脚本,几分钟内把应用文件夹变成专业的安装程序。
- 为 Electron 应用创建 Windows 安装程序使用 Electron Packager 或 Forge 打包 Electron 应用,再把输出文件夹变成带向导、快捷方式和卸载程序的 Setup.exe,无需配置 electron-builder。
- 在线生成 NSIS 安装程序,无需编写脚本了解 NSIS 是什么、最小化的 .nsi 脚本长什么样,以及如何通过填写表单而不是编写脚本,得到带 Modern UI 向导、快捷方式和卸载程序的标准 NSIS Setup.exe。