手册建议允许按名称指定包:
{
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.allowUnfreePredicate
在nixpkgs/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
函数的输入(这里)。 完毕 ;-)