nixos modules

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 的。

direnv HM module