SuperAPI AI 工具集

nix-platform-specific-options

部署与运维

查看项目

更新于 10-15 21:37

技能介绍

用途:编写需要按平台(NixOS 与 Darwin)隐藏或启用特定选项的 Nix 模块。仅用 mkIf 会导致无限递归或“选项不存在”等求值错误,本技能记录正确写法。

核心规则:平台类判断(isDarwin、!isDarwin)用 optionalAttrs,在解析时求值;依赖配置值的判断(cfg.enable、cfg.flavor)用 mkIf,惰性求值。

示例要点:平台判断应写成 config = optionalAttrs (!isDarwin) { users.defaultUserShell = pkgs.zsh; };,而非用 mkIf 包裹。配置值不能放在 optionalAttrs 条件中,应嵌套为 optionalAttrs isDarwin (mkIf (cfg.flavor == "personal") { ... })。选项默认值不要引用 config,应先用 null 默认,再在 config 段内解析。

组合用法:config = mkIf cfg.enable (mkMerge [ 公共配置; (optionalAttrs isDarwin {...}); (optionalAttrs (!isDarwin) {...}); (optionalAttrs isDarwin (mkIf (cfg.flavor == "personal") {...})) ])。

排查:出现 _module.freeformType 或 anon-43 的无限递归报错时,检查选项默认值中的 config. 引用、optionalAttrs 条件中的 cfg. 引用,以及用 mkIf 守卫平台专属选项的写法,可用命令检索:grep -rn "mkOpt.*config." modules/;grep -rn "optionalAttrs.*cfg." modules/;grep -rn "mkIf.*isDarwin" modules/。