从外部Nix存储库安装

rns*_*nso 4 install package nix

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

Dan*_*our 5

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

Nix仅理解Nix表达式,它用于构建和安装软件。有一些转换方法(例如,用于阴谋集团),但是对于大多数软件来说,一个需要具有相应的Nix表达式才能与Nix一起使用。

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

使用该功能buildFHSUserEnv可以创建包含某些Nix软件包的FHS环境。为了能够.deb与Nix 一起使用打包的软件,因此必须:

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

这不是一个简单的过程,而是在这里进行了更深入的说明。

在大多数情况下,创建一个普通的“本机” Nix软件包以适当的方式构建它会更加简单-如果可以访问该软件的源代码。创建一个包标准./configuremakemake 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
}
Run Code Online (Sandbox Code Playgroud)

有关此问题的一些文档可以在nixpkgs手册中找到。

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