Shane Xu's Home

Life is too short for so much sorrow.

nix作为包管理工具并用于发布软件的可行性研究

前言

什么是包管理器

软件包管理系统是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用。 在Linux发行版中,几乎每一个发行版都有自己的软件包管理系统。常见的有:

  • 管理deb软件包的dpkg以及它的前端apt(使用于Debian、Ubuntu)。
  • RPM包管理员以及它的前端dnf(使用于Fedora)、前端yum(使用于Red Hat Enterprise Linux)、前端ZYpp(使用于openSUSE)、前端urpmi(使用于Mandriva Linux、Mageia)等。

使用软件包管理系统将大大简化在Linux发行版中安装软件的过程。

蛮荒时代

在有软件包管理器之前,Linux上是如何安装软件的呢?那时候(包括现在部分软件),在类似github或者自建版本控制中心上发布源码。开发者需要自行下载源码,然后使用类似下面的流程编译安装:

   ./configure --prefix=/usr/local
   make
   make install

这个流程看似简单,但是对一些较为复杂的软件,需要安装其直接运行时依赖,在安装直接依赖的过程还要解决直接依赖的直接依赖,在这个解决依赖的过程中,很容易发生各种不可预知的问题,这就是所谓的 dependency hell

比如,以emacs编辑器为例,通过 apt-rdepends -d emacs-gtk 命令绘出它的依赖图如下:

emacs-gtk-dep-tree.png

大概就是一团乱麻吧。

Nix包管理器

Nix是一个强大的包管理工具,它使得包管理更可靠并且可重现。Nix提供了原子级别的升级和回滚操作,多版本安装,多用户包管理,和方便的开发环境设置。

About

Nix是一个引入了纯函数概念的包管理器。它把软件包当做值来处理。其打包过程也直接用函数来描述。正如函数式编程语言中纯函数的概念一般,相同的输入总会有相同的输出。在nix里面就是,一旦打包成功,包就不会再改变。Nix将软件包,保存在 /nix/store 下面,每个软件包都有自己独立的目录,例如:

   /nix/store/j5swdjgkmg11x2zhi1gnr92mab46xj00-cmake-3.16.3

j5swdjgkmg11x2zhi1gnr92mab46xj00

参考文档

https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F

https://zhuanlan.zhihu.com/p/42402896

https://nixos.org/nix/manual

Comments

comments powered by Disqus