第 7 部分 · 走向生产:工程化与实战
打包分发——从可执行文件到三平台安装包
raco exe给你一个可执行文件,但普通用户要的是双击安装的体验——这篇拆解从可执行文件到 Windows、macOS、Linux 原生安装包的跨平台分发全流程。
上一章你把包发布进了官方目录——那是给会装包的人准备的。可你把程序发给朋友或者同事试试:他们不装 Racket,也不想敲命令行,他们要的是双击安装、开始菜单里有图标、不要了能卸载。这一步,raco 只负责一半。
先把整条链路摆出来:
Racket 源码 → raco exe → 可执行文件 → raco distribute → 可分发目录 → 平台安装器 → 用户安装
分界线很清楚:Racket 负责到「可分发目录」为止,让程序在没装 Racket 的机器上也能跑;再往后——安装向导、快捷方式、卸载——是操作系统的事。 这不是 Racket 偷懒:注册表、.app 包结构、签名校验,每一样都是平台原生规范,跟语言无关。Racket 的选择是把「如何运行」做扎实,「如何安装」交给你平台上的现成工具。
Windows:Inno Setup
Windows 用户的预期很统一:setup.exe 安装向导、开始菜单快捷方式、控制面板能卸载。推荐用 Inno Setup——免费、稳定、对「目录型应用」支持完善。
先出可分发目录:
raco exe main.rkt
raco distribute dist myapp
然后写一份最小的 Inno Setup 脚本:
[Setup]
AppName=MyApp
DefaultDirName={pf}\MyApp
[Files]
Source: "dist\*"; DestDir: "{app}"; Flags: recursesubdirs
[Icons]
Name: "{group}\MyApp"; Filename: "{app}\myapp.exe"
编译脚本,得到 setup.exe——Windows 这条线就走完了。
macOS:.app 加 dmg
macOS 的 .app 不是单个文件,是一个有固定结构的目录:
MyApp.app/
└─ Contents/
├─ MacOS/ # 存放 raco distribute 输出
├─ Resources/
└─ Info.plist # 应用元数据
流程三步:把 raco distribute 的输出放进 Contents/MacOS,补上 Info.plist,再用工具打成 dmg 镜像,用户拖拽安装。两个顺手的工具:create-dmg 生成镜像,codesign 做基础代码签名;要分发给外面的人,再加 gon 走公证流程。
Linux:解压即用
Linux 用户对「安装」的预期本来就不一样,最简单的方式反而最地道:
tar czvf myapp-linux.tar.gz dist/
用户侧解压就能跑:
tar xzvf myapp-linux.tar.gz
./dist/myapp
想再进一步,AppImage 做单文件分发;deb/rpm 要学各家的打包规范;Flatpak 带沙箱化部署——都看你愿意为分发投入多少。
三条线一张表
| 平台 | 工具链 | 输出格式 | 用户体验 |
|---|---|---|---|
| Windows | Inno Setup | setup.exe | 向导安装 |
| macOS | app+dmg | .dmg | 拖拽安装 |
| Linux | tar.gz | .tar.gz | 解压即用 |
最后记住那句话就够了:Racket 解决「如何运行」,平台工具解决「如何安装」。 先确认 raco distribute 出来的目录能独立运行,再挑各平台最省事的安装方案;签名、自动更新这些高级特性,留到有真实用户之后再说。Inno Setup 的脚本写法、macOS 的签名与公证、Linux 的打包规范,每一项都值得单独深挖——但那是分发这一层的下一层,不在语言这一层。