我可以安装一些在 Nix 存储库中不可用但作为 deb 或 rpm 文件或作为源 (tar.gz) 可用的包(使用 Nix)吗?这样做的方法是什么?这只能在 NixOS 或安装在其他 Linux 发行版中的 Nix 上完成吗?感谢您的洞察力。
问问题
1578 次
1 回答
5
Nix 包管理器是一个管理软件的程序。为此,与所有包管理器一样,该软件需要打包成合适的格式。
Nix 只理解Nix 表达式,它用于构建和安装软件。有一些转换方法(例如对于 cabal 包),但对于大多数软件,需要有一个相应的 Nix 表达式才能与 Nix 一起使用。
也就是说,通常可以.deb
从其他包管理器中解包(例如)包。由于大多数其他包管理器都遵循文件系统层次标准(FHS),因此有一种方法可以将它们与 Nix 一起使用:
使用该功能buildFHSUserEnv
可以创建一个包含一些 Nix 包的FHS 环境。为了能够在.deb
Nix 中使用打包软件,必须:
- 创建一个 Nix 表达式来解压缩
.deb
文件。这个表达式的结果是一个带有软件的 Nix 包,它不起作用,因为包含的软件将在 FHS 目录中查找其依赖项。 - 创建一个 FHS 环境并将之前构建的包以及所有依赖项加载到其中。
这不是一个简单的过程,而是在这里进行了一些深入的解释。
大多数情况下,如果可以访问软件的源代码,则创建一个普通的“本机”Nix 包以适当的方式构建软件要简单得多。./configure
为标准构建过程创建一个包是微不足道的make
:make 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 回答