Linux 软件包管理技术的历史与演进 - 张老师
2023-07-16 12:41 作者:ComeTogetherCome | 我要投稿

早期使用 make 命令从分发的源码构建软件,缺点是卸载/升级十分不便。然后出现了基础的包管理工具:“包”就是包含元信息的软件,包管理用于增删改查系统中的包。比如 Debian 平台上的 dpkg 工具,管理 deb 格式的包。deb 格式文件一般包含 control data scripts 三个部分。control 中涵盖了软件的依赖信息,data 是软件主体。Redhat 上的 rpm 工具与 dpkg 类似。
但是这些基础包管理器仍然无法自动解决依赖不满足的情况,因此出现了基于基础包管理器的高级包管理器,比如 Debian 的 apt 和 Redhat 的 dnf,这些高级包管理器接入了发行版维护的软件仓库,统一收集并分发软件,解决了自动处理依赖关系、版本管理、签名管理等问题。arch wiki 中列出了不同包管理器相似功能的对比。软件仓库可以自行维护,有许多仓库镜像站,tuna 提供了部署脚本。Debian 系的许多发行版虽然都使用 apt,但不同发行版的源并不能混用(显然)。
即使有了高级包管理器,也不能完全解决依赖冲突的问题。因此出现了新型包管理器,一般具有跨发行版、隔离性、部署简单等特点,比如 snap、AppImage、Flatpak 等。隔离等特性虽然很好地避免了依赖冲突,但同样也会带来了权限等方面的问题。复用性与易用性的 trade off、沙箱机制与权限的 trade off。(个人习惯:只对那些在依赖中偏末端的软件,比如用户直接使用的 GUI 软件使用新型包管理器,基础组件仍使用系统原生包管理器)