가져온 조건자를 재정의하는 방법은 무엇입니까?

가져온 조건자를 재정의하는 방법은 무엇입니까?

다음을 포함하는 것을 고려해보세요 /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이면 패키지 설치가 허용됩니다.

이 작업을 수행하는 더 쉬운 방법이 있기를 바랍니다.

관련 정보