summary refs log tree commit diff
path: root/nixos/doc/manual/from_md/development/replace-modules.section.xml
blob: d5115092bf61340c6add4330958c2b20b879e636 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-replace-modules">
  <title>Replace Modules</title>
  <para>
    Modules that are imported can also be disabled. The option
    declarations, config implementation and the imports of a disabled
    module will be ignored, allowing another to take its place. This can
    be used to import a set of modules from another channel while
    keeping the rest of the system on a stable release.
  </para>
  <para>
    <literal>disabledModules</literal> is a top level attribute like
    <literal>imports</literal>, <literal>options</literal> and
    <literal>config</literal>. It contains a list of modules that will
    be disabled. This can either be the full path to the module or a
    string with the filename relative to the modules path (eg.
    &lt;nixpkgs/nixos/modules&gt; for nixos).
  </para>
  <para>
    This example will replace the existing postgresql module with the
    version defined in the nixos-unstable channel while keeping the rest
    of the modules and packages from the original nixos channel. This
    only overrides the module definition, this won’t use postgresql from
    nixos-unstable unless explicitly configured to do so.
  </para>
  <programlisting language="bash">
{ config, lib, pkgs, ... }:

{
  disabledModules = [ &quot;services/databases/postgresql.nix&quot; ];

  imports =
    [ # Use postgresql service from nixos-unstable channel.
      # sudo nix-channel --add https://nixos.org/channels/nixos-unstable nixos-unstable
      &lt;nixos-unstable/nixos/modules/services/databases/postgresql.nix&gt;
    ];

  services.postgresql.enable = true;
}
</programlisting>
  <para>
    This example shows how to define a custom module as a replacement
    for an existing module. Importing this module will disable the
    original module without having to know its implementation details.
  </para>
  <programlisting language="bash">
{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.programs.man;
in

{
  disabledModules = [ &quot;services/programs/man.nix&quot; ];

  options = {
    programs.man.enable = mkOption {
      type = types.bool;
      default = true;
      description = &quot;Whether to enable manual pages.&quot;;
    };
  };

  config = mkIf cfg.enabled {
    warnings = [ &quot;disabled manpages for production deployments.&quot; ];
  };
}
</programlisting>
</section>