如何在Nixos configuration.nix中覆盖2(两个)包

Riz*_*ary 5 nixos nix

我的配置中有一些要覆盖的包.nix.所以我编写如下代码:

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";
      };
    });
  };
};
Run Code Online (Sandbox Code Playgroud)

};

但是当我这样做时nixos-rebuild switch,我收到以下错误:

syntax error, unexpected ':', expecting '.' or '=', at 37,11
Run Code Online (Sandbox Code Playgroud)

这是在pkgs:rec {...

我做错了什么?首先,我通过分离像这样的pkgs来写它:

packageOverrides = {
  pkgs: with pkgs: {......}; #this is for mumble
  pkgs: rec {...}; #this is for kernel
};
Run Code Online (Sandbox Code Playgroud)

仍然有同样的错误.

Pet*_*ons 13

适当的解决方案是:

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";
        };
      });
    };
  };
}
Run Code Online (Sandbox Code Playgroud)

变量super是指应用覆盖之前设置的Nixpkgs self,并应用覆盖之后引用它.明确区分这两者以避免无限递归等很重要.

另外,请注意您的覆盖

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

linuxPackages属性集替换为只包含(overriden)e1000e派生的属性集.这可能不是你想要的.

  • 事实上,“self”绑定是不必要的。我将其添加到示例中主要是出于习惯,因为人们经常需要它。 (2认同)