首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在有效时设置NixOS配置选项,以实现向后兼容性。

仅在有效时设置NixOS配置选项,以实现向后兼容性。
EN

Unix & Linux用户
提问于 2020-02-29 22:26:13
回答 1查看 558关注 0票数 2

偶尔,NixOS会以一种不完全向后兼容的方式更改配置选项。例如,nixos 19.09没有programs.gnupg.agent.pinentryFlavor选项,但是在nixos不稳定(很快20.03)中,我需要将它设置为一个非默认值,以便获得正确的pinentry变量。

我在机器上共享我的配置,其中一些机器运行nixos-19.09和一些nixos-不稳定,所以我希望我的配置与两者兼容。(即使没有多台机器,也可以在不损坏的情况下切换nixos通道。)

programs.gnupg.agent.pinentryFlavor = "gtk2";设置为nixos-不稳定导致nixos-rebuild在nixos上失败-19.09:

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

有没有一种方法来检查一个选项是否有效?

本质上,我在这里寻找应该写什么来代替???(pinentryFlavor)),这样就不会设置一个不存在的选项:

代码语言:javascript
复制
programs.gnupg.agent = { enable = true;} // (
  if ???(pinentryFlavor)
  then { pinentryFlavor = "gtk2"; }
  else {});
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-03-08 19:32:41

配置函数确实接收到options attr,因此在配置中设置该选项之前,可以检查给定选项是否使用builtins.hasAttr定义。

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

代码语言:javascript
复制
{ 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使用的选项,这些选项通常是不可用的。

而不是在运行VM时需要通过环境变量设置选项,如

代码语言:javascript
复制
QEMU_OPTS='-m 4096 -smp 4 -soundhw ac97' ./result/bin/run-*-vm

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

代码语言:javascript
复制
  # 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" ];
    };
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/570466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档