Life is too short for so much sorrow.
软件包管理系统是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用。 在Linux发行版中,几乎每一个发行版都有自己的软件包管理系统。常见的有:
使用软件包管理系统将大大简化在Linux发行版中安装软件的过程。
在有软件包管理器之前,Linux上是如何安装软件的呢?那时候(包括现在部分软件),在类似github或者自建版本控制中心上发布源码。开发者需要自行下载源码,然后使用类似下面的流程编译安装:
./configure --prefix=/usr/local make make install
这个流程看似简单,但是对一些较为复杂的软件,需要安装其直接运行时依赖,在安装直接依赖的过程还要解决直接依赖的直接依赖,在这个解决依赖的过程中,很容易发生各种不可预知的问题,这就是所谓的 dependency hell 。
比如,以emacs编辑器为例,通过 apt-rdepends -d emacs-gtk
命令绘出它的依赖图如下:
大概就是一团乱麻吧。
Nix是一个强大的包管理工具,它使得包管理更可靠并且可重现。Nix提供了原子级别的升级和回滚操作,多版本安装,多用户包管理,和方便的开发环境设置。
Nix是一个引入了纯函数概念的包管理器。它把软件包当做值来处理。其打包过程也直接用函数来描述。正如函数式编程语言中纯函数的概念一般,相同的输入总会有相同的输出。在nix里面就是,一旦打包成功,包就不会再改变。Nix将软件包,保存在 /nix/store
下面,每个软件包都有自己独立的目录,例如:
/nix/store/j5swdjgkmg11x2zhi1gnr92mab46xj00-cmake-3.16.3
j5swdjgkmg11x2zhi1gnr92mab46xj00