2、打包格式全景:主流打包格式一览
聊打包格式之前,我先说说自己的一个体会。刚入行那会儿,我总觉得「能跑就行,管它什么格式」。结果呢?有一次给客户交付Linux下的工具,我图省事直接打了个tar.gz扔过去。对方运维一脸懵:「我们这全是RPM仓库管理的,你让我手动解压?」——嗯,从那以后,我再也不敢小看格式选择这件事了。
说白了,每种打包格式背后都对应着一套生态。你选什么格式,决定了用户怎么装、怎么卸、怎么管理依赖。今天咱们就把主流格式挨个捋一遍。
2.1 TGZ(.tar.gz)—— 通用但「裸」
TGZ其实就是tar压缩后再用gzip压缩。它不包含任何元数据,没有依赖信息,也没有安装脚本。就是一个文件包。
我个人的习惯是:如果目标用户是开发者,或者软件不需要复杂的安装流程,TGZ是最省事的。比如Go语言写的单二进制工具,直接打个TGZ扔GitHub Releases上就行。
2.2 DEB —— Debian/Ubuntu 的「亲儿子」
DEB是Debian系(包括Ubuntu、Mint等)的原生格式。它支持依赖声明、预安装/后安装脚本、配置文件标记。说白了,apt-get install 能自动帮你搞定一切。
| 特性 | 说明 |
|---|---|
| 依赖管理 | 自动安装/卸载依赖包 |
| 脚本支持 | preinst、postinst、prerm、postrm |
| 配置文件 | 升级时保留用户修改 |
| 签名验证 | 支持GPG签名 |
我在项目中遇到过最典型的场景:给客户部署一个内部监控工具,依赖libssl和libcurl。如果用TGZ分发,客户得自己装依赖,版本不对还报错。换成DEB包,一条 apt install ./monitor.deb 就全搞定了。
2.3 RPM —— Red Hat/CentOS/Fedora 的「老大哥」
RPM和DEB功能上几乎是对等的。区别在于包管理工具不同(yum/dnf vs apt),以及一些元数据字段的命名差异。
举个例子:DEB用 Depends 声明依赖,RPM用 Requires。DEB用 Section 分类,RPM用 Group。本质上是一回事。
我个人建议:如果你的软件主要面向服务器端,RPM是更稳妥的选择。因为很多企业生产环境用的是CentOS或RHEL,他们不接受DEB包。
2.4 NSIS —— Windows 上的「万能安装器」
NSIS(Nullsoft Scriptable Install System)是Windows平台最流行的开源安装制作工具。它生成一个 .exe 安装程序,用户双击就能跑。
NSIS的强大之处在于脚本化。你可以写NSIS脚本控制安装流程:选择安装路径、创建快捷方式、写注册表、启动服务……几乎无所不能。
; NSIS 脚本片段示例
Section "MainProgram" SEC01
SetOutPath "$INSTDIR"
File "myapp.exe"
File "config.ini"
CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\myapp.exe"
SectionEnd
我记得有一次要给客户做一个Windows下的驱动安装工具。用户需要先装VC++运行库,再装驱动,最后配置防火墙规则。用NSIS写了个脚本,三步合一,用户点一下「下一步」就全自动了。客户反馈说:「这才叫安装嘛!」
RequestExecutionLevel admin 才搞定。
2.5 DMG —— macOS 的「拖拽式安装」
DMG是macOS上的磁盘映像格式。用户双击挂载后,把 .app 拖到 Applications 文件夹就完成了安装。简单到极致。
但简单背后有门道。DMG包需要处理好几个细节:
- 背景图要好看(用户第一眼看到的就是它)
- Applications文件夹的快捷方式要放好
- 代码签名不能少(否则Gatekeeper会拦截)
我个人觉得DMG是「用户体验最好」的打包格式。用户不需要理解安装过程,拖一下就行。但代价是:你得多花时间打磨那个磁盘映像的视觉效果。
2.6 ZIP —— 跨平台的「万金油」
ZIP是唯一一个在所有主流操作系统上都能原生解压的格式。Windows自带、macOS自带、Linux装个unzip就能用。
ZIP的缺点和TGZ类似:没有元数据、没有依赖管理、没有安装脚本。但它比TGZ多一个优势:支持分卷压缩和加密。
| 格式 | 跨平台性 | 元数据 | 依赖管理 | 安装脚本 |
|---|---|---|---|---|
| TGZ | ⭐⭐⭐⭐ | ❌ | ❌ | ❌ |
| DEB | ⭐⭐ | ✅ | ✅ | ✅ |
| RPM | ⭐⭐ | ✅ | ✅ | ✅ |
| NSIS | ⭐ | ✅ | ❌ | ✅ |
| DMG | ⭐ | ✅ | ❌ | ❌ |
| ZIP | ⭐⭐⭐⭐⭐ | ❌ | ❌ | ❌ |
你想想看,如果你的用户群体很杂——有Windows、有macOS、有Linux——那ZIP可能是唯一的选择。比如Java的JDK分发,Oracle就提供了ZIP包,因为谁都能用。
2.7 怎么选?我的决策框架
说了这么多,到底怎么选?我总结了一个简单的决策树:
- 用户是开发者? → TGZ 或 ZIP,省事
- 用户是Linux服务器运维? → DEB 或 RPM,看发行版
- 用户是Windows小白? → NSIS,一键安装
- 用户是macOS用户? → DMG,拖拽安装
- 用户跨平台且不确定? → ZIP,兼容性最好
下一章咱们聊聊CPack怎么配置这些格式。到时候我会手把手教你写CMakeLists.txt,让你一次配置,到处打包。