我可以安装一些在Nix存储库中没有的软件包(使用Nix),但可以作为deb或rpm文件或源文件(tar.gz)使用吗?这样做的方法是什么?这可以仅在NixOS上或在其他Linux发行版中安装的Nix中完成吗?感谢您的见解。
答案 0 :(得分:5)
Nix包管理器是一个管理软件的程序。为此,与所有包管理器一样,此软件需要打包成合适的格式。
Nix只了解 Nix表达式,它用于构建和安装软件。有一些转换方法(例如用于cabal包),但对于大多数软件,需要有一个相应的Nix表达式才能与Nix一起使用。
也就是说,通常可以从其他包管理器解包包(例如.deb
)。由于大多数其他软件包管理员遵循Filesystem Hierarchy Standard (FHS),因此可以采用Nix的方式使用它们:
使用函数buildFHSUserEnv
可以创建包含一些Nix包的FHS environment。为了能够在Nix上使用.deb
打包软件,必须这样做:
.deb
文件。这个表达式的结果是带有软件的Nix包,它不起作用,因为包含的软件将在FHS目录中查找其依赖项。这不是一个简单的程序,但在某种程度上进行了解释here。
大多数情况下,如果一个人可以访问软件的源代码,就可以更简单了 - 创建一个正常的" native" 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 manual。
中找到无论是单独使用Nix还是在NixOS中使用,后一种方法都可以使用。对于前者,如果无法在基本系统上使用Linux命名空间,则可能会出现问题。