以前のバージョンとの互換性のためにNixOS設定オプションが有効な場合にのみこれを設定してください。

以前のバージョンとの互換性のためにNixOS設定オプションが有効な場合にのみこれを設定してください。

時々、NixOSは以前のバージョンと完全に互換性がないように設定オプションを変更します。たとえば、 nixos 19.09 にはオプションがありませんが、programs.gnupg.agent.pinentryFlavornixos 不安定 (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

設定機能は属性を受け取るため、設定でオプションを設定する前に、そのオプションが定義されていることを確認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" ];
    };

関連情報