在传统的软件管理方式(如 apt、yum、brew)中,安装软件往往依赖于全局环境(如 /usr/bin
、/lib
等),这意味着:
- 构建结果受环境影响:如果你的
/usr/lib
目录有不同的库版本,你的软件可能表现不同,甚至编译失败。 - 依赖地狱(Dependency Hell):不同软件可能依赖不同版本的库,无法同时满足。
而 Nix 规定所有构建都是纯函数,软件包的安装和构建必须是“纯粹的”,即:
- 相同输入 → 产生相同输出
- 不依赖外部环境(如
/usr/bin
) - 所有依赖项都是显式声明的
Nix 构建软件的方式就像数学上的函数:f(x) = y
,相同的 x
(源码 + 依赖)一定会产生相同的 y
(软件包)
这意味着,即使你在不同的系统上构建,结果也是完全一致的(可复现性)。