Nix(OS):仅为一个包构建设置 "permittedInsecurePackages"(在覆盖层中?)

Nix(OS): Set "permittedInsecurePackages" only for one package build (in an overlay?)

我只想为我在 nix 的叠加层中定义的构建应用配置点。

也就是我要设置

permittedInsecurePackages = [
     "webkitgtk-2.4.11"
];

在叠加层中。我想在那里做,因为覆盖是为了设置我的爪子邮件配置;如果我不安装 claws-mail,我不想允许 webkitgtk(如果我将它放入 ~/.config/nixpkgs/config.nix,这可能会发生)。

有没有办法在叠加层中设置它?我尝试将其设置为 self.config。或 super.config.,但均无效。

首先,让我澄清一些事情,希望能帮助您理解一些 NixOS 和 Nixpkgs 概念。

NixOS 模块主要与系统配置有关,而覆盖主要只是一种对包集进行更改的机制。这些是一起分发的两个独立组件(NixOS 和 Nixpkgs)的独立功能。

NixOS 在评估时会加载 Nixpkgs。这可以用一些 NixOS options 来控制。其中大部分只是简单地传递给 Nixpkgs 函数(通常表示为 import <nixpkgs>)。

这意味着 NixOS 配置控制 Nixpkgs 的 config 参数。但是,overlays 只是 Nixpkgs 函数的另一个参数,不会影响 Nixpkgs config.

另请注意,selfsuper 只是通常为定义叠加层的函数的参数指定的名称。它们是位置参数,因此您可以根据需要给它们不同的名称。叠加函数的结果是包含要添加或更新的属性的属性集。 selfsuper 作为 Nixpkgs 中的属性没有特殊含义。 (虽然你确实隐藏了 super package

所以不,覆盖不能设置 Nixpkgs 配置项。相反,您可能想编写一个 NixOS 模块。 NixOS 模块和 NixOS 配置是一回事。

另请注意,NixOS(nixos-rebuild 等)不会读取 ~/.config/nixpkgs/config.nix。它有自己的 default.

您不能在本地覆盖配置,但是您可以阻止该配置妨碍您试图实现的目标。

此处最简单的事情是清除传递给 claws-mail 构建的 webkitgtk 副本中的 meta.knownVulnerabilities

展示如何做到这一点 --

let
  ignoringVulns = x: x // { meta = (x.meta // { knownVulnerabilities = []; }); };
  webkitGtkIgnoringVulns = pkgs.webkitgtk24x-gtk2.overrideAttrs ignoringVulns;
in
  pkgs.clawsMail.override { webkitgtk24x-gtk2 = webkitGtkIgnoringVulns; }

以上是在nix repl中测试的。在覆盖图中,您可以将 pkgs. 替换为 super.,以指代手头软件包的 original/unmodified 版本;如果您不想要它,将 webkitGtkIgnoringVulns 保留在 let 中仍然很重要(或者 而不是 将其引入您的覆盖评估的 attrset 中)在任何其他范围内定义。

也就是说,在叠加层中执行此操作可能如下所示:

self: super: let
  ignoringVulns = x: x // { meta = (x.meta // { knownVulnerabilities = []; }); };
in {
  clawsMail = super.clawsMail.override {
    webkitgtk24x-gtk2 = self.webkitgtk24x-gtk2.overrideAttrs ignoringVulns;
  };
}