跳到正文

在 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 桌面上:

  1. 生成应用的 Windows 版本,使一个文件夹中包含 MyApp.exe 及其文件。Electron Packager、PyInstaller(需在 Windows 或 Windows 虚拟机中运行,因为 PyInstaller 不支持交叉编译)、GOOS=windows go build、cargo build --target x86_64-pc-windows-gnu 等都能产出这样的文件夹。
  2. 将文件夹压缩为 .zip 并上传。
  3. 填写名称、版本、发布者、安装范围、快捷方式和语言。添加一个 .ico。
  4. 构建并下载 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 指南。

相关指南