仅当 NixOS 配置选项有效时才设置它,以实现向后兼容性

仅当 NixOS 配置选项有效时才设置它,以实现向后兼容性

有时,NixOS 会以不完全向后兼容的方式更改配置选项。例如,nixos 19.09没有选项programs.gnupg.agent.pinentryFlavor,但在nixos不稳定(即将20.03)中我需要将其设置为非默认值以获得正确的pinentry变体。

我在机器之间共享我的配置,其中一些运行 nixos-19.09,一些运行 nixos-unstable,所以我希望我的配置与两者兼容。 (即使没有多台机器,如果能够在不中断的情况下切换 nixos 频道就好了)

programs.gnupg.agent.pinentryFlavor = "gtk2";根据 nixos-unstable 需要进行设置会导致nixos-rebuildnixos-19.09 上失败:

error: The option `programs.gnupg.agent.pinentryFlavor' defined in `[...]/desktop.nix' does not exist.
(use '--show-trace' to show detailed location information)

有没有办法检查选项是否有效?

本质上,我正在寻找在???(pinentryFlavor)这里写什么来代替 ) ,以免设置不存在的选项:

programs.gnupg.agent = { enable = true;} // (
  if ???(pinentryFlavor)
  then { pinentryFlavor = "gtk2"; }
  else {});

答案1

配置函数确实接收一个optionsattr,因此可以builtins.hasAttr在配置中设置给定选项之前检查是否已定义。

大多数 NixOS 配置不会提取options,因此您可能需要先添加它。例如:

{ config, pkgs, options, ... }:
{
  programs.gnupg.agent =
    { enable = true;  } //
    # False on NixOS 19.09
    (if builtins.hasAttr "pinentryFlavor" options.programs.gnupg.agent
     then { pinentryFlavor = "gtk2"; }
     else {});
}

同样,可以使用相同的方法来设置 所使用的选项nixos-rebuild build-vm,这些选项通常不可用。

运行虚拟机时不需要通过环境变量设置选项,例如

QEMU_OPTS='-m 4096 -smp 4 -soundhw ac97' ./result/bin/run-*-vm

可以在configuration.nix中设置等效选项:

  # The default 384MB RAM is not enough to run Firefox in a VM
  virtualisation =
    lib.optionalAttrs (builtins.hasAttr "qemu" options.virtualisation) {
      memorySize = 4096;
      cores = 4;
      qemu.options = [ "-soundhw ac97" ];
    };

相关内容