4

我可以安装一些在 Nix 存储库中不可用但作为 deb 或 rpm 文件或作为源 (tar.gz) 可用的包(使用 Nix)吗?这样做的方法是什么?这只能在 NixOS 或安装在其他 Linux 发行版中的 Nix 上完成吗?感谢您的洞察力。

4

1 回答 1

5

Nix 包管理器是一个管理软件的程序。为此,与所有包管理器一样,该软件需要打包成合适的格式。

Nix 只理解Nix 表达式,它用于构建和安装软件。有一些转换方法(例如对于 cabal 包),但对于大多数软件,需要有一个相应的 Nix 表达式才能与 Nix 一起使用。

也就是说,通常可以.deb从其他包管理器中解包(例如)包。由于大多数其他包管理器都遵循文件系统层次标准(FHS),因此有一种方法可以将它们与 Nix 一起使用:

使用该功能buildFHSUserEnv可以创建一个包含一些 Nix 包的FHS 环境。为了能够在.debNix 中使用打包软件,必须:

  1. 创建一个 Nix 表达式来解压缩.deb文件。这个表达式的结果是一个带有软件的 Nix 包,它不起作用,因为包含的软件将在 FHS 目录中查找其依赖项。
  2. 创建一个 FHS 环境并将之前构建的包以及所有依赖项加载到其中。

这不是一个简单的过程,而是在这里进行了一些深入的解释。

大多数情况下,如果可以访问软件的源代码,则创建一个普通的“本机”Nix 包以适当的方式构建软件要简单得多。./configure为标准构建过程创建一个包是微不足道的makemake install

{ stdenv, fetchurl, autoconf }: # Add other dependencies here, as parameters to the function
stdenv.mkDerivation {
  name = "FOO-1.42b"; # name of the package
  src = fetchurl { # there's also fetchgit and other helpers
    url = mirror://sourceforge/FOO/FOO-1.42b-src.tar.gz;
    sha256 = "07iwv4j4d2n7f7iffv2xfi1lyp4vr0m9qw40pidw15h1jczxgps9";
  };
  meta = {
    homepage = http://foo.bar;
    description = "bar foo bar foo";
    license = stdenv.lib.licenses.bsd3; # adjust
    platforms = stdenv.lib.platforms.all;
  };
  buildInputs = [ autoconf ]; # just as example, autoconf needed if ...
  preConfigure = "make -f Makefile.aux prepare"; # ... this step of the build hasn't been done upstream yet
  # configureFlags, preBuild, installTargets , ... only if non standard build
}

有关这方面的一些文档可以在nixpkgs 手册中找到。

无论是单独使用 Nix 还是在 NixOS 中使用,后一种方法都有效。对于前者,如果您不能在基本系统上使用 Linux 命名空间,您可能会遇到问题。

于 2015-11-25T19:20:25.520 回答