Home Explore Blog CI



nixpkgs

1st chunk of `nixos/doc/manual/configuration/modularity.section.md`
eade42968fce31b5c4eb8485c6d24db01660dd3387bb0eee00000001000007f1
# Modularity {#sec-modularity}

The NixOS configuration mechanism is modular. If your
`configuration.nix` becomes too big, you can split it into multiple
files. Likewise, if you have multiple NixOS configurations (e.g. for
different computers) with some commonality, you can move the common
configuration into a shared file.

Modules have exactly the same syntax as `configuration.nix`. In fact,
`configuration.nix` is itself a module. You can use other modules by
including them from `configuration.nix`, e.g.:

```nix
{ config, pkgs, ... }:

{ imports = [ ./vpn.nix ./kde.nix ];
  services.httpd.enable = true;
  environment.systemPackages = [ pkgs.emacs ];
  # ...
}
```

Here, we include two modules from the same directory, `vpn.nix` and
`kde.nix`. The latter might look like this:

```nix
{ config, pkgs, ... }:

{ services.xserver.enable = true;
  services.displayManager.sddm.enable = true;
  services.xserver.desktopManager.plasma5.enable = true;
  environment.systemPackages = [ pkgs.vim ];
}
```

Note that both `configuration.nix` and `kde.nix` define the option
[](#opt-environment.systemPackages). When multiple modules define an
option, NixOS will try to *merge* the definitions. In the case of
[](#opt-environment.systemPackages) the lists of packages will be
concatenated. The value in `configuration.nix` is
merged last, so for list-type options, it will appear at the end of the
merged list. If you want it to appear first, you can use `mkBefore`:

```nix
{
  boot.kernelModules = mkBefore [ "kvm-intel" ];
}
```

This causes the `kvm-intel` kernel module to be loaded before any other
kernel modules.

For other types of options, a merge may not be possible. For instance,
if two modules define [](#opt-services.httpd.adminAddr),
`nixos-rebuild` will give an error:

```plain
The unique option `services.httpd.adminAddr' is defined multiple times, in `/etc/nixos/httpd.nix' and `/etc/nixos/configuration.nix'.
```

When that happens, it's possible to force one definition take precedence
over the others:

```nix

Title: Modularity in NixOS Configuration
Summary
NixOS configurations can be modularized by splitting the `configuration.nix` file into multiple files or sharing common configurations across different systems. Modules have the same syntax as `configuration.nix` and can be included using the `imports` attribute. When multiple modules define the same option, NixOS attempts to merge the definitions, concatenating lists like `environment.systemPackages`. The `mkBefore` function can be used to ensure an element appears at the beginning of a list. In cases where merging is not possible, such as with `services.httpd.adminAddr`, an error will occur, requiring one definition to take precedence.