インポートした述語をオーバーライドする方法は?

インポートした述語をオーバーライドする方法は?

以下を含めることを検討してください/etc/nixos/root.nix

{
  nixpkgs.config.allowUnfreePredicate = pkg:
    builtins.elem (lib.getName pkg) [
      "foo"
    ];
}

/etc/nixos/configuration.nixこの構成は、独自に以下を提供するようにインポートされますallowUnfreePredicate

{
  imports = [
    /etc/nixos/root.nix
  ];

  nixpkgs.config.allowUnfreePredicate = pkg:
    builtins.elem (lib.getName pkg) [
      "bar"
    ];
}

この場合、pkgs.bar最後の述語が最初の述語をオーバーライドするためにのみインストールできます。それらを組み合わせる方法はありますか?特に、/etc/nixos/configuration.nix輸入品がこの述語を指定するかどうかを「知っている」べきではないことを考慮するとどうでしょうか。

修正する:アップストリームレポートそこで解決してほしい。

答え1

これはうまくいきますが、非常に複雑です。

{
  config,
  lib,
  modulesPath,
  pkgs,
  specialArgs,
  options,
}: let
  imports = [
    /etc/nixos/cachix.nix
    /etc/nixos/root.nix
  ];
in {
  inherit imports;

  nixpkgs.config.allowUnfreePredicate = pkg:
    (builtins.elem (lib.getName pkg) [
      "bar"
    ])
    || builtins.any (
      path: let
        package = import path {
          inherit config lib modulesPath pkgs specialArgs options;
        };
      in
        if builtins.hasAttr "nixpkgs" package
        then package.nixpkgs.config.allowUnfreePredicate pkg
        else false
    )
    imports;
}

オリジナル:

  1. 筆記体セットをimports作らずに参考にできるように抜いてみてください。rec
  2. 各インポートにその内容があることを確認しnixpkgs(ないため、cachix設定を含めましたnixpkgs)、その場合はallowUnfreePredicateパッケージに合っていることを確認してください。
  3. インポートがallowUnfreePredicatetrueの場合、パッケージのインストールは許可されます。

これを行うより簡単な方法があることを願っています。

関連情報