基于文件内容隐式去重而不是显式约定存放规则的系统包管理器
依赖地狱。不同的包在摆放依赖的时候要遵守同一套规矩(即共享系统目录),所以它们的行为对对方是可见的可能产生冲突。
自持(self-contained)打包。Vendor(这怎么翻译)全部的依赖。极端做法如Go,全静态链接的编译。大部分厂商会以单独文件的形式存放在可执行入口的路径附近。造成很多重复的通用依赖(如Electron)。比消耗存储更糟糕的是消耗内存:操作系统无法获知不同软件的同一(名字的)依赖库是否完全一致,不能共享代码段。
方案:先自持打包,然后再去重存储。ZFS有类似的功能,但是对上层操作系统隐藏。更进一步的,操作系统对路径不同但是实际为完全一致的依赖库在不同进程之间共享。配合一些社区约定(如大家都用LTS版本的Electron),减少内存占用。
进一步利用去重带来的操作系统有感的DAG结构来获取一些传统方案生成的好处。当特定依赖有重大安全性更新的时候,可以将应用分叉出一个沙盒分支,在分支内只替换这一个依赖库,与主分支共享其他二进制、应用配置和用户状态。
感觉Nix应该把这个事干了,但是它好像(还)没有,挺奇怪的。
和小伙伴讨论了一下。我应该先去调研一下主流的自持打包方案(snap,flatpak,appimage),看看它们有没有把这个事做了。
本文由作者按照 CC BY 4.0 进行授权