从Nix存储库外部安装

时间:2015-11-23 14:22:21

标签: package install nix

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

1 个答案:

答案 0 :(得分:5)

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

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

也就是说,通常可以从其他包管理器解包包(例如.deb)。由于大多数其他软件包管理员遵循Filesystem Hierarchy Standard (FHS),因此可以采用Nix的方式使用它们:

使用函数buildFHSUserEnv可以创建包含一些Nix包的FHS environment。为了能够在Nix上使用.deb打包软件,必须这样做:

  1. 创建Nix表达式以解压缩.deb文件。这个表达式的结果是带有软件的Nix包,它不起作用,因为包含的软件将在FHS目录中查找其依赖项。
  2. 创建FHS环境并将之前的构建包及所有依赖项加载到其中。
  3. 这不是一个简单的程序,但在某种程度上进行了解释here

    大多数情况下,如果一个人可以访问软件的源代码,就可以更简单了 - 创建一个正常的" native" 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
    }
    

    有关此问题的一些文档可在nixpkgs manual

    中找到

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