Racket 编程入门

第 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 带沙箱化部署——都看你愿意为分发投入多少。

三条线一张表

平台工具链输出格式用户体验
WindowsInno Setupsetup.exe向导安装
macOSapp+dmg.dmg拖拽安装
Linuxtar.gz.tar.gz解压即用

最后记住那句话就够了:Racket 解决「如何运行」,平台工具解决「如何安装」。 先确认 raco distribute 出来的目录能独立运行,再挑各平台最省事的安装方案;签名、自动更新这些高级特性,留到有真实用户之后再说。Inno Setup 的脚本写法、macOS 的签名与公证、Linux 的打包规范,每一项都值得单独深挖——但那是分发这一层的下一层,不在语言这一层。