NixOS RFC42-style module as library [nix-0001]

不知道叫做 RFC42-style module 这个名字合适不合适,因为 RFC42 实际上并不是定义 module 的。但是既然 flake.parts 这么叫了,那就继续沿用了。

❄️ Nix 程序的组织中,经常需要,但是并没有默认提供定义方式的是 library 的写法。即有一系列常用或相关的函数,想要在程序的全局中方便地调用。

最直觉想到的解决方式是一个 mylib.nix,其接收一些必要的参数,返回一个含所有函数的 attrset

{ lib, inputs, nixpkgs }:
  {
    mkSystem = nixpkgs.lib.nixosSystem { ... };

    mkEmptyFreeformOption = description: lib.mkOption {
      type = lib.types.submodule {
        freeformType = format.type;
      };
      default = { };
      inherit description;
    };
  }
社区中的例子🌰:
  1. Ryan4yin 的 NixOS config
  2. Mitchell Hashimoto 的 NixOS config

另外一个方式是从 srid 在 flake-parts 中提的 issue 中学到的,利用 module 实现的全局共享函数。借助 module 的自动合并和自动应用,可以比较优雅地共享 library。不过不确定的一点是,这么做是否构成了对 options 的滥用,或者说违反了 options 的语义。

尽管该 issue 还处于 open 状态,flake-parts 对于这个问题还没有共识。但在自己的配置中这么做还是没有问题。