【问题标题】:How to override 2 (two) packages in Nixos configuration.nix如何在 Nixos configuration.nix 中覆盖 2(两个)包
【发布时间】:2016-06-30 06:10:29
【问题描述】:

我的 configuration.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";
        };
      });
    };
  };
};

但是当我执行nixos-rebuild switch 时,出现以下错误:

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

位于pkgs: rec {...

我做错了什么?一开始我是通过像这样分隔 pkg 来写的:

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

仍然出现同样的错误。

【问题讨论】:

    标签: nix nixos


    【解决方案1】:

    正确的解决办法是:

    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 派生的属性集。这可能不是你想要的。

    【讨论】:

    • 它看起来不像 self,由 let 绑定引入,从未被使用过。在这种情况下还有必要吗?
    • self 绑定确实是不必要的。我根据习惯将它添加到示例中,主要是因为人们经常需要它。
    • 关于您的评论“还要注意...”,正确的做法是什么?
    • 现在应该通过覆盖解决这个问题吗? packageOverrides 和使用覆盖有什么区别?
    • @MarcDefiant To question1:是的,可以,但是packageOverrides are not officially deprecated yet。链接的问题也有关于可能仍然适用的用例的 cmets。致question2:找不到太多,但希望弃用 RFC 能够阐明这一点 - 一旦准备就绪..:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2018-07-28
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多