Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Modules

Definition

{ mkStr, mkBool, ... }:
{
  modules.myModule = {
    target = "nixos";           # "nixos", "darwin", "home", or null (all)
    requires = [ "base" ];      # dependencies
    options = {
      setting = mkStr "default";
    };
    module = { node, ... }: {
      # NixOS/Darwin/HM config
    };
  };
}

Fields

target

Restricts module to specific platforms:

  • "nixos" - NixOS only
  • "darwin" - nix-darwin only
  • "home" - Home Manager only
  • null - All platforms

requires

List of module names that must be enabled:

modules.desktop = {
  requires = [ "base" "gui" ];
  # ...
};

Build fails if requirements aren’t met.

options

Option declarations using helpers or standard lib.mkOption:

options = {
  name = mkStr null;
  enabled = mkBool true;
  ports = mkList lib.types.port [ 80 443 ];
};

module

NixOS/Darwin/HM module. Receives special arguments:

ArgumentDescription
nodeCurrent node’s clean config
nodesAll nodes’ clean configs
nameNode name
systemSystem string

Splitting Modules

Same-name modules across files are merged:

# modules/base/base.nix
modules.base.options.hostName = mkStr null;
modules.base.module = { node, ... }: {
  networking.hostName = node.base.hostName;
};

# modules/base/boot.nix
modules.base.module = {
  boot.loader.systemd-boot.enable = true;
};