aboutsummaryrefslogtreecommitdiff
path: root/FAQ.md
blob: eebbad818d2d614ae14c78578dc70183f5d7b600 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
Frequently Asked Questions (FAQ)
================================

Why is there a collision error when switching generation?
---------------------------------------------------------

Home Manager currently installs packages into the user environment,
precisely as if the packages were installed through
`nix-envĀ --install`. This means that you will get a collision error if
your Home Manager configuration attempts to install a package that you
already have installed manually, that is, packages that shows up when
you run `nix-envĀ --query`.

For example, imagine you have the `hello` package installed in your
environment

```console
$ nix-env --query
hello-2.10
```

and your Home Manager configuration contains

    home.packages = [ pkgs.hello ];

Then attempting to switch to this configuration will result in an
error similar to

```console
$ home-manager switch
these derivations will be built:
  /nix/store/xg69wsnd1rp8xgs9qfsjal017nf0ldhm-home-manager-path.drv
[ā€¦]
Activating installPackages
replacing old ā€˜home-manager-pathā€™
installing ā€˜home-manager-pathā€™
building path(s) ā€˜/nix/store/b5c0asjz9f06l52l9812w6k39ifr49jj-user-environmentā€™
Wide character in die at /nix/store/64jc9gd2rkbgdb4yjx3nrgc91bpjj5ky-buildenv.pl line 79.
collision between ā€˜/nix/store/fmwa4axzghz11cnln5absh31nbhs9lq1-home-manager-path/bin/helloā€™ and ā€˜/nix/store/c2wyl8b9p4afivpcz8jplc9kis8rj36d-hello-2.10/bin/helloā€™; use ā€˜nix-env --set-flag priority NUMBER PKGNAMEā€™ to change the priority of one of the conflicting packages
builder for ā€˜/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drvā€™ failed with exit code 2
error: build of ā€˜/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drvā€™ failed
```

The solution is typically to uninstall the package from the
environment using `nix-envĀ --uninstall` and reattempt the Home Manager
generation switch.

Why are the session variables not set?
--------------------------------------

Home Manager is only able to set session variables automatically if it
manages your Bash or Z shell configuration. If you don't want to let
Home Manager manage your shell then you will have to manually source
the

    ~/.nix-profile/etc/profile.d/hm-session-vars.sh

file in an appropriate way. In Bash and Z shell this can be done by
adding

```sh
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
```

to your `.profile` and `.zshrc` files, respectively. The
`hm-session-vars.sh` file should work in most Bourne-like shells.

How do set up a configuration for multiple users/machines?
----------------------------------------------------------

A typical way to prepare a repository of configurations for multiple
logins and machines is to prepare one "top-level" file for each unique
combination.

For example, if you have two machines, called "kronos" and "rhea" on
which you want to configure your user "jane" then you could create the
files

- `kronos-jane.nix`,
- `rhea-jane.nix`, and
- `common.nix`

in your repository. On the kronos and rhea machines you can then make
`~jane/.config/nixpkgs/home.nix` be a symbolic link to the
corresponding file in your configuration repository.

The `kronos-jane.nix` and `rhea-jane.nix` files follow the format

```nix
{ ... }:

{
  imports = [ ./common.nix ];

  # Various options that are specific for this machine/user.
}
```

while the `common.nix` file contains configuration shared across the
two logins. Of course, instead of just a single `common.nix` file you
can have multiple ones, even one per program or service.

You can get some inspiration from the [Post your home-manager home.nix
file!][1] Reddit thread.

[1]: https://www.reddit.com/r/NixOS/comments/9bb9h9/post_your_homemanager_homenix_file/

Why do I get an error message about `ca.desrt.dconf`?
-----------------------------------------------------

You are most likely trying to configure the GTK or Gnome Terminal but
the DBus session is not aware of the dconf service. The full error you
might get is

    error: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files

The solution on NixOS is to add

    services.dbus.packages = with pkgs; [ gnome3.dconf ];

to your system configuration.

How do I install packages from Nixpkgs unstable?
------------------------------------------------

If you are using a stable version of Nixpkgs but would like to install
some particular packages from Nixpkgs unstable then you can import the
unstable Nixpkgs and refer to its packages within your configuration.
Something like

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

let

  pkgsUnstable = import <nixpkgs-unstable> {};

in

{
  home.packages = [
    pkgsUnstable.foo
  ];

  # ā€¦
}
```

should work provided you have a Nix channel called `nixpkgs-unstable`.
Note, the package will not be affected by any package overrides,
overlays, etc.

How do I override the package used by a module?
-----------------------------------------------

By default Home Manager will install the package provided by your
chosen `nixpkgs` channel but occasionally you might end up needing to
change this package. This can typically be done in two ways.

1. If the module provides a `package` option, such as
   `programs.beets.package`, then this is the recommended way to
   perform the override. For example,

   ```
   programs.beets.package = pkgs.beets.override { enableCheck = true; };
   ```

2. If no `package` option is available, then you can typically
   override the relevant package using an [overlay][nixpkgs-overlays].

   For example, if you want to use the `programs.skim` module but use
   the `skim` package from Nixpkgs unstable, then a configuration like

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

   let

     pkgsUnstable = import <nixpkgs-unstable> {};

   in

   {
     programs.skim.enable = true;

     nixpkgs.overlays = [
       (self: super: {
         skim = pkgsUnstable.skim;
       })
     ];

     # ā€¦
   }
   ```

   should work OK.

[nixpkgs-overlays]: https://nixos.org/nixpkgs/manual/#chap-overlays