Configuration

僅在 NixOS 配置選項有效時才設置它,以實現向後兼容性

  • March 8, 2020

有時,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 {});

配置函式確實接收到一個options屬性,因此可以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" ];
   };

引用自:https://unix.stackexchange.com/questions/570466