如何覆盖 Nix 中的包源?

How can I override a package source in Nix?

所以我想用更新的 fork 替换我的 home-manager 配置中的 pkgs.picom。我该怎么做?

我有一种感觉:

let newPicom = pkgs.picom.override.src.url = "https://github.com/ibhagwan/picom";  
in 
services.picom.package = newPicom; 

但是知道 Nix 实际上可能是一些很长的咒语 self: super: 等等。

nixos.wiki has an example 覆盖包源。

您确实需要提供可复制的来源。 github 存储库 url 是可变的,因此您需要指定修订版。

{ pkgs, ... }:
let newPicom = pkgs.picom.overrideAttrs (old: {
      version = "git"; # usually harmless to omit
      src = /* put your source here; typically a local path or
               a fixed-output derivation produced by
               `fetchFromGitHub`.
               builtins.fetchGit is also an option. Doesn't run
               in parallel but does fetch private sources. */;
    });
in {
  services.picom.package = newPicom; 
}

重叠

let
  picom_overlay = (self: super: {
    picom = super.picom.overrideAttrs (prev: {
      version = "git";
      src = pkgs.fetchFromGitHub {
        owner = "yshui";
        repo = "picom";
        rev = "31e58712ec11b198340ae217d33a73d8ac73b7fe";
        sha256 = pkgs.lib.fakeSha256;
      };
    });
  });
in
  nixpkgs.overlays = [ picom_overlay ];

当然,sha256应该替换为构建后输出错误中显示的相关散列——在这种情况下:

sha256 = "sha256-VBnIzisg/7Xetd/AWVHlnaWXlxX+wqeYTpstO6+T5cE=";

picom-next

请注意,还有一个 picom-next 包,因此您可以选择这样做:

let
  picom_overlay = (self: super: {
    picom = super.picom.overrideAttrs (oldAttrs: rec {
      inherit (super.picom-next) pname version src;
    });
  });
in
  nixpkgs.overlays = [ picom_overlay ];

或者根据@RobertHensing 的建议更简单:

services.picom.package = pkgs.picom-next;