2016-03-15 53 views
1

我有一些包可以在我的configuration.nix中覆蓋。所以我寫的代碼如下:如何在Nixos configuration.nix中覆蓋2(兩個)包

nixpkgs.config = { 
    allowUnfree = true; 
    packageOverrides = { 
    pkgs: rec { 
     #mumble + pulse audio 
    mumble = pkgs.mumble.override { 
     pulseSupport = true; 
     }; 

#kernel for intel ethernet and Testing e1000e package override 
    linuxPackages.e1000e = pkgs.linuxPackages.e1000e.overrideDerivation (attrs: { 
     name = "e1000e-3.3.3-${config.boot.kernelPackages.kernel.version}"; 
     src = fetchurl { 
     url = "https://www.dropbox.com/s/pxx883hx9763ygn/e1000e-3.3.3.tar.gz?dl=0"; 
     sha256 = "1s2w54927fsxg0f037h31g3qkajgn5jd0x3yi1chxsyckrcr0x80"; 
     }; 
    }); 
    }; 
}; 

};

但是當我做nixos-rebuild switch,我得到了以下錯誤:

syntax error, unexpected ':', expecting '.' or '=', at 37,11 

這是PKGS:REC {...

我做了什麼錯?起初,我通過這樣分開pkgs來編寫它:

packageOverrides = { 
    pkgs: with pkgs: {......}; #this is for mumble 
    pkgs: rec {...}; #this is for kernel 
}; 

並且仍然得到相同的錯誤。

回答

8

正確的解決方案是:

nixpkgs.config = { 

    allowUnfree = true; 

    packageOverrides = super: let self = super.pkgs; in { 

    mumble = super.mumble.override { pulseSupport = true; }; 

    linuxPackages = super.linuxPackages // { 
     e1000e = super.linuxPackages.e1000e.overrideDerivation (old: { 
     name = "e1000e-3.3.3-${config.boot.kernelPackages.kernel.version}"; 
     src = fetchurl { 
      url = "https://www.dropbox.com/s/pxx883hx9763ygn/e1000e-3.3.3.tar.gz?dl=0"; 
      sha256 = "1s2w54927fsxg0f037h31g3qkajgn5jd0x3yi1chxsyckrcr0x80"; 
     }; 
     }); 
    }; 
    }; 
} 

可變super指Nixpkgs設置之前的替換值被應用,並且self是指它的替換值施加。區分這兩種明確,以避免無限遞歸等

也很重要,請注意您覆蓋

linuxPackages.e1000e = pkgs.linuxPackages.e1000e.overrideDerivation ...

替換linuxPackages屬性與一個包含什麼,但(重寫)e1000e推導設置。這可能不是你想要的。

+0

它看起來並不像由let綁定引入的'self'被使用。在這種情況下甚至有必要嗎? –

+1

確實,「自我綁定」是不必要的。我主要通過習慣將它添加到示例中,因爲通常人們確實需要它。 –

+0

關於您的評論「還請注意......」,正確的方法是什麼? –