summaryrefslogtreecommitdiffstats
path: root/templates/blog/posts/2024-10-22_nix_flakes.html.template
blob: d19190809c32b2b06b7e581812873660b6e42a29 (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
71
72
73
74
75
76
77
78
79
80
81
82
{{define "title"}}nix flakes for busy people{{end}}

<h2>TL;DR</h2>

<h4>To enable flakes on a NixOS system</h4>

<p>Just put</p>

<pre>
  nix.settings.experimental-features = [
    "nix-command"
    "flakes"
  ];
</pre>

<p>in your <code>configuration.nix</code>. IMO it's a shame that flakes
have been locked behind experimental for so long, it's a large part of
why they have a bad reputation. It's absolutely worth enabling them
since they're so useful.</p>

<h4>To use a flake from github</h4>

<pre>
nix shell github:ggerganov/llama.cpp
</pre>

<p>or to install a specific flake output:</p>

<pre>
nix shell github:ggerganov/llama.cpp#rocm
</pre>

<p>To list the outputs for a specific flake, you can usually type
<code>nix shell github:ggerganov/llama.cpp#&lt;tab&gt;</code> and your
shell may or may not list the outputs. If anyone has a better way to do this,
please let me know.</p>

<p>To install a flake in your system profile, use</p>

<pre>
nix profile install github:ggerganov/llama.cpp
</pre>

<p>Here is the greatest power of nix flakes: the ability to install and
use them as first-class packages just like anything from nixpkgs. It
feels a lot better integrated than something like the AUR.</p>

<h4>To create a nix flake for your own project</h4>

<pre>
nix flake init -t templates#go-hello
</pre>

<p>Replace go-hello with whatever template you want that most closely
matches your project configuration. Unfortunately many of these templates
have the questionable behavior of also overwriting source files in the
current directory, so I recommend only running nix flake init in an
empty directory, and copying the flake.nix file over to your
existing project.</p>

<h2>A philosophical intro to nix flakes</h2>

<p>Flakes are a way to replace the centralized nixpkgs repository with
decentralized packages controlled directly by upstream. In many ways
Linux packaging has been moving more and more towards upstream with
things like appimages or flatpak, and being able to remove many of the
distro-specific hacks needed to make things run on various systems. Nix
flakes address this same issue, by allowing upstream to control their own
flake.nix, and pull in the specific versions of any dependencies they
might need. They also give an easy way to install any programs that
might not be packaged yet for nixpkgs, as long as anyone has written a
flake and published it online.</p>

<h2>The bad parts</h2>

<p>Nix flakes are still rough around the edges, and the worst part for
a new Nix user is the lack of documentation. This is a large part of why
I'm writing yet another nix flakes tutorial!
<a href="https://xeiaso.net/blog/nix-flakes-1-2022-02-21/">https://xeiaso.net/blog/nix-flakes-1-2022-02-21</a>
is really good, but reading this as a new user, I only wanted to know
how to install an app packaged with flakes, and I didn't care so much
about how to package my own stuff yet.</p>