如何直接在`allowUnfreePredicate`中使用包?

如何直接在`allowUnfreePredicate`中使用包?

手册建议允许按名称指定包:

{
  allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "roon-server"
    "vscode"
  ];
}

是否可以直接使用包来执行此操作?我尝试了以下方法:

{
  allowUnfreePredicate = pkg:
    builtins.elem pkg [
      pkgs.hplip
    ];
}

这似乎不起作用:

错误: /nix/store/lh7i6yw570nkw49byrgjbrna9az3ryy7-nixos-22.05/nixos/pkgs/misc/drivers/hplip/default.nix:268 中的软件包“hplip-3.22.6”具有不自由的许可证(“unfree”),拒绝评估。

pkg对象是否与 中的条目不同pkgs,是否builtins.elem未将复杂对象视为相等,或者是否发生了其他情况?

答案1

您的代码失败的原因是不是因为builtins.elem(这可以很好地比较严格等效的包)但是因为allowInfreePredicate属性包装(内部stdenv.mkDerivation {…}),当然还有stdenv.mkDerivation {…} != …

您如何自己检查/查找:

作为旁注,您实际上可以自己看看是否使用这个简单的技巧来浏览精彩的内容(在您提出问题之前我什至没有意识到这一点)nixpkgs 存储库(这是出于教育目的,我花了一些时间才发现如何有效地浏览 nix 代码……能够使用几个命令轻松阅读整个操作系统的代码真是太棒了!这是我喜欢的一部分与尼克斯!):

为此,首先得到nixpkgs 的代码。建议:下载

git clone https://github.com/NixOS/nixpkgs

在您的主文件夹中,将它放在您身边非常实用!

然后,使用rg allowUnfreePredicate -C 5(rg是一个更好的 grep,你应该真正安装它,-C 5在上面/下面显示 5 行,查看周围的文本非常实用)。您将直接看到config.allowUnfreePredicatenixpkgs/pkgs/stdenv/generic/check-meta.nix(这里) 定义一个新函数allowUnfreePredicate,它本身被称为这里在 中hasDeniedUnfreeLicense,本身被调用为checkValidity(相同的文件) 本身被调用到assertValidity(相同的文件)…(是的,这是一个简单的游戏,你只需输入rg当前函数的名称即可找到下一个函数^^)。这个功能终于实现了输出的从文件中check-meta.nix。再次使用我们的朋友,rg check-meta.nix不难看出这个文件是进口的pkgs/stdenv/generic/make-derivation.nix作为checkMeta.最后(诚然,这是一个相当长的旅程,通常会更快^^')这个函数被调用这里带有一个参数args,该参数是mkDerivation函数的输入(这里)。 完毕 ;-)

答案2

公认的间接解决方案来自特拉特作品:

{
  allowUnfreePredicate = pkg:
    builtins.elem (
      lib.getName pkg
    ) (
      map lib.getName [
        pkgs.corefonts
        pkgs.discord
        pkgs.jetbrains.idea-ultimate
        pkgs.spotify-unwrapped
        pkgs.unrar
      ]
    );
}

相关内容