2015-11-23 68 views
2

我可以安裝一些在Nix存儲庫中不可用的軟件包(使用Nix),但可以作爲deb或rpm文件或作爲源文件(tar.gz)使用嗎?有什麼辦法呢?這隻能在NixOS上完成,還是在其他Linux發行版中安裝Nix?感謝您的洞察力。從外部Nix存儲庫安裝

回答

4

Nix包管理器是一個管理軟件的程序。爲此,與所有軟件包管理器一樣,此軟件需要打包成適合的格式。

Nix只能理解Nix表達式,它用於構建和安裝軟件。有一些轉換方法(例如對於cabal包),但是對於大多數軟件,需要有相應的Nix表達式才能夠與Nix一起使用。

也就是說,通常可以從其他軟件包管理器解包(例如.deb)。由於大多數其他包裝管理者遵循Filesystem Hierarchy Standard (FHS)有與尼克斯使用它們無論哪種方式,一種方式:

使用功能buildFHSUserEnv一個可以創建一個包含一些尼克斯包的FHS environment。爲了能夠使用與尼克斯一.deb打包的軟件,一個因而必須:

  1. 創建尼克斯表達式來解壓縮文件.deb。這個表達式的結果是一個帶有軟件的Nix軟件包,它不工作,因爲包含的軟件將在FHS目錄中查找它的依賴關係。
  2. 創建一個FHS環境並將之前的構建包以及所有依賴項加載到它中。

這不是一個簡單的程序,但在一定深度here解釋。

大多數情況下,它更簡單 - 如果有人可以訪問軟件的源代碼 - 創建一個正常的「本地」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命名空間,則可能會遇到問題。