2、打包格式全景:主流打包格式一览

聊打包格式之前,我先说说自己的一个体会。刚入行那会儿,我总觉得「能跑就行,管它什么格式」。结果呢?有一次给客户交付Linux下的工具,我图省事直接打了个tar.gz扔过去。对方运维一脸懵:「我们这全是RPM仓库管理的,你让我手动解压?」——嗯,从那以后,我再也不敢小看格式选择这件事了。

说白了,每种打包格式背后都对应着一套生态。你选什么格式,决定了用户怎么装、怎么卸、怎么管理依赖。今天咱们就把主流格式挨个捋一遍。

2.1 TGZ(.tar.gz)—— 通用但「裸」

TGZ其实就是tar压缩后再用gzip压缩。它不包含任何元数据,没有依赖信息,也没有安装脚本。就是一个文件包。

适用场景: 跨平台分发、源码包、便携式工具、Docker镜像层。

我个人的习惯是:如果目标用户是开发者,或者软件不需要复杂的安装流程,TGZ是最省事的。比如Go语言写的单二进制工具,直接打个TGZ扔GitHub Releases上就行。

小技巧: TGZ包里最好放一个 install.sh 脚本,让用户能一键部署。别指望所有人都知道怎么解压后手动配置环境变量。

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 就全搞定了。

注意: DEB包的版本号格式有严格规范。我曾经因为版本号里多了一个「-」导致apt拒绝升级,排查了半天才发现是版本比较逻辑的问题。

2.3 RPM —— Red Hat/CentOS/Fedora 的「老大哥」

RPM和DEB功能上几乎是对等的。区别在于包管理工具不同(yum/dnf vs apt),以及一些元数据字段的命名差异。

举个例子:DEB用 Depends 声明依赖,RPM用 Requires。DEB用 Section 分类,RPM用 Group。本质上是一回事。

适用场景: 企业级Linux环境、CentOS/RHEL/Fedora生态、OpenSUSE。

我个人建议:如果你的软件主要面向服务器端,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写了个脚本,三步合一,用户点一下「下一步」就全自动了。客户反馈说:「这才叫安装嘛!」

避坑指南: 我曾经在NSIS脚本里忘了处理管理员权限问题。结果安装时写注册表失败,用户一脸懵。后来加了个 RequestExecutionLevel admin 才搞定。

2.5 DMG —— macOS 的「拖拽式安装」

DMG是macOS上的磁盘映像格式。用户双击挂载后,把 .app 拖到 Applications 文件夹就完成了安装。简单到极致。

但简单背后有门道。DMG包需要处理好几个细节:

  • 背景图要好看(用户第一眼看到的就是它)
  • Applications文件夹的快捷方式要放好
  • 代码签名不能少(否则Gatekeeper会拦截)
适用场景: macOS桌面应用分发、App Store之外的分发渠道。

我个人觉得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 怎么选?我的决策框架

说了这么多,到底怎么选?我总结了一个简单的决策树:

  1. 用户是开发者? → TGZ 或 ZIP,省事
  2. 用户是Linux服务器运维? → DEB 或 RPM,看发行版
  3. 用户是Windows小白? → NSIS,一键安装
  4. 用户是macOS用户? → DMG,拖拽安装
  5. 用户跨平台且不确定? → ZIP,兼容性最好
最后提醒一句: 别想着「一个包打天下」。我见过有人试图用ZIP包覆盖所有平台,结果Windows用户抱怨没有安装向导,Linux用户抱怨没有依赖管理。该分平台打包时就得分。

下一章咱们聊聊CPack怎么配置这些格式。到时候我会手把手教你写CMakeLists.txt,让你一次配置,到处打包。