有时,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-rebuild
nixos-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
配置函数确实接收一个options
attr,因此可以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" ];
};