resources #
https://nixos.org/manual/nixos/stable/index.html#sec-writing-modules https://nixos.wiki/wiki/NixOS_modules
structure #
{
imports = [
# 引用的其他的 modules
./otherRelativePathModule.nix # 相对路径
/absolute/path/module.nix # 绝对路径
# default modules, 不需要自己 import
# https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/module-list.nix
];
options = {
# option declarations
# 定义这个 module 可以设置的值, module 的用户在使用的时候通过这些 options 定制行为
# module 使用者可以定制或者设置的选项,例如 `enable`
# 例如
enable = mkOption {
type = lib.types.bool;
default = false;
example = true;
description = "Whether to enable this module.";
};
};
config = {
# options definitions
# 需要依赖的 settings, services or resources
};
# 可以有 meta: https://nixos.org/manual/nixos/stable/index.html#sec-meta-attributes
meta = {};
}
module
可以是接收 attribute set 并返回上面解构的函数:
参数 attribute set 可能会要求有下面的参数 config
, options
, pkgs
, modulesPaths
。没有找到明确的文档说需要哪些参数。
{ config, options, pkgs, modulesPath, ... }:
{
imports = [
# modulesPath 来自于环境变量 NIX_PATH, 所以空的时候会有 undefined variable 'modulesPath'
(modulesPath + "/profiles/qemu-guest.nix")
];
# ...
}
config
shorthand
#
{
imports = [
# Paths to other modules.
];
# 没有 options declarations: options = {}
# config definitions 可以直接用下面的 shorthand 形式, 省略了外层的 "config { }"
services.othermodule.enable = true;
}
也因为这个,可以有下面这个 HM module
{ config, pkgs, ... }:
{
# imports
# options = {}
# config definitions
programs.git = {
enable = true;
userName = "John Doe";
userEmail = "john@example.com";
};
}
NIX_PATH
$ echo $NIX_PATH | tr : '\n'
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos
nixos-config=/etc/nixos/configuration.nix
/nix/var/nix/profiles/per-user/root/channels
例子中, import <nixpkgs>
就加载 /nix/var/nix/profiles/per-user/root/channels/nixos
。
declarations #
# example
optionName = mkOption {
type = lib.types.bool;
default = false;
example = true;
description = "Whether to enable this cool module.";
}
# this is the same as
optionName = mkEnableOption "this cool module";
name
type
option 的类型,可选,但是可以帮助 debug。default
默认值example
description
merge
apply
options
home-manager modules #
https://nix-community.github.io/home-manager/index.xhtml#ch-writing-modules
HM 的 module 是基于 NixOS 的 module 的。