NixOS RFC42-style module as library [nix-0001]
NixOS RFC42-style module as library [nix-0001]
不知道叫做 RFC42-style module 这个名字合适不合适,因为 RFC42 实际上并不是定义 module 的。但是既然 flake.parts 这么叫了,那就继续沿用了。
在 程序的组织中,经常需要,但是并没有默认提供定义方式的是 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;
};
}
社区中的例子🌰:
另外一个方式是从 srid 在 flake-parts 中提的 issue 中学到的,利用 module 实现的全局共享函数。借助 module 的自动合并和自动应用,可以比较优雅地共享 library。不过不确定的一点是,这么做是否构成了对 options 的滥用,或者说违反了 options 的语义。
尽管该 issue 还处于 open 状态,flake-parts 对于这个问题还没有共识。但在自己的配置中这么做还是没有问题。