PageSourceSearch

https://pi3r.be/notebook/nix/index.html

html pi3r.be collected 2026-09-25 22:38:31 UTC 19,641 bytes, 584 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3  <head>
4    <meta charset="utf-8">
5    <meta name="viewport" content="width=device-width,initial-scale=1">
6    <title>Nix :: 𝛑3r</title>
7    <link rel="canonical" href="https://pi3r.be/notebook/nix/index.html">
8    <meta name="generator" content="Antora 2.3.3">
9    <link rel="stylesheet" href="../../_/css/site.css">
10<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/themes/algolia-min.css">
11<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
12<link rel="stylesheet" href="../../_/css/site-extra.css">
13<link rel="stylesheet" href="../../_/css/site-custom.css">
14<link rel="icon" href="../../_/img/favicon.ico" type="image/x-icon">
15    
15<script>var uiRootPath = '../../_'</script>
15
16  </head>
17  <body class="article">
18<header class="header" role="banner">
19  <nav class="navbar">
20    <div class="navbar-brand">
21      <a class="navbar-item" href="https://pi3r.be">
22        <img src="../../_/img/logo.png" alt="logo">
23      </a>
24      <a class="navbar-item" href="https://pi3r.be">
25          <div class="navbar-item" >𝛑3r</div>
26      </a>
27      <div class="navbar-item search">
28          <button type="button" class="search">
29          </button>
30          <input id="search-input" class="searchbox" type="search" placeholder="Search docs" autofocus />
31      </div>
32      <button class="navbar-burger" data-target="topbar-nav">
33        <span></span>
34        <span></span>
35        <span></span>
36      </button>
37    </div>
38    <div id="topbar-nav" class="navbar-menu">
39      <div class="navbar-end">
40        <a class="navbar-item" href="/notebook">Notebook</a>
41        <div class="navbar-item">
42          <span class="control">
43            <a class="button is-primary" href="../../_/attachments/CV_PRadermecker_en_2019.pdf">Curriculum Vitae</a>
44          </span>
45        </div>
46        <a class="navbar-item" href="https://github.com/PierreR" alt="Github">
47          <img src="../../_/img/github-mark.png" alt="Github" title="Github" />
48        </a>
49        </div>
50      </div>
51    </div>
52  </nav>
53</header>
54<div class="body">
55<div class="nav-container" data-component="notebook" data-version="master">
56  <aside class="nav">
57    <div class="panels">
58<div class="nav-panel-menu is-active" data-panel="menu">
59  <nav class="nav-menu">
60    <h3 class="title"><a href="index.html">Notebook</a></h3>
61<ul class="nav-list">
62  <li class="nav-item" data-depth="0">
63<ul class="nav-list">
64  <li class="nav-item is-current-page" data-depth="1">
65    <button class="nav-item-toggle"></button>
66    <a class="nav-link" href="index.html">Nix</a>
67<ul class="nav-list">
68  <li class="nav-item" data-depth="2">
69    <a class="nav-link" href="concepts.html">Concepts</a>
70  </li>
71  <li class="nav-item" data-depth="2">
72    <a class="nav-link" href="language.html">Language</a>
73  </li>
74  <li class="nav-item" data-depth="2">
75    <a class="nav-link" href="cli.html">CLI</a>
76  </li>
77  <li class="nav-item" data-depth="2">
78    <a class="nav-link" href="concepts.html">Concepts</a>
79  </li>
80  <li class="nav-item" data-depth="2">
81    <a class="nav-link" href="nixpkgs.html">Nixpkgs</a>
82  </li>
83  <li class="nav-item" data-depth="2">
84    <a class="nav-link" href="nixos.html">NixOS</a>
85  </li>
86</ul>
87  </li>
88  <li class="nav-item" data-depth="1">
89    <button class="nav-item-toggle"></button>
90    <a class="nav-link" href="../containers/index.html">Containers</a>
91<ul class="nav-list">
92  <li class="nav-item" data-depth="2">
93    <a class="nav-link" href="../containers/concepts.html">Concepts</a>
94  </li>
95  <li class="nav-item" data-depth="2">
96    <a class="nav-link" href="../containers/networking.html">Networking</a>
97  </li>
98  <li class="nav-item" data-depth="2">
99    <a class="nav-link" href="../containers/mesh.html">Service Mesh</a>
100  </li>
101  <li class="nav-item" data-depth="2">
102    <a class="nav-link" href="../containers/storage.html">Storage</a>
103  </li>
104  <li class="nav-item" data-depth="2">
105    <a class="nav-link" href="../containers/docker.html">Docker</a>
106  </li>
107  <li class="nav-item" data-depth="2">
108    <a class="nav-link" href="../containers/openshift.html">OpenShift</a>
109  </li>
110  <li class="nav-item" data-depth="2">
111    <a class="nav-link" href="../containers/components.html">Cluster components</a>
112  </li>
113  <li class="nav-item" data-depth="2">
114    <a class="nav-link" href="../containers/pipeline.html">CICD Pipeline</a>
115  </li>
116  <li class="nav-item" data-depth="2">
117    <a class="nav-link" href="../containers/eks.html">EKS</a>
118  </li>
119</ul>
120  </li>
121  <li class="nav-item" data-depth="1">
122    <button class="nav-item-toggle"></button>
123    <a class="nav-link" href="../elk/es.html">ELK</a>
124<ul class="nav-list">
125  <li class="nav-item" data-depth="2">
126    <a class="nav-link" href="../elk/logstash.html">Logstash</a>
127  </li>
128  <li class="nav-item" data-depth="2">
129    <a class="nav-link" href="../elk/beats.html">Beats</a>
130  </li>
131  <li class="nav-item" data-depth="2">
132    <a class="nav-link" href="../elk/kafka.html">Kafka</a>
133  </li>
134</ul>
135  </li>
136  <li class="nav-item" data-depth="1">
137    <button class="nav-item-toggle"></button>
138    <span class="nav-text">
138Haskell</span>
139<ul class="nav-list">
140  <li class="nav-item" data-depth="2">
141    <a class="nav-link" href="../haskell/concepts.html">Concepts</a>
142  </li>
143  <li class="nav-item" data-depth="2">
144    <a class="nav-link" href="../haskell/convention.html">Conventions</a>
145  </li>
146  <li class="nav-item" data-depth="2">
147    <a class="nav-link" href="../haskell/development.html">Development</a>
148  </li>
149  <li class="nav-item" data-depth="2">
150    <a class="nav-link" href="../haskell/folds.html">Folds</a>
151  </li>
152  <li class="nav-item" data-depth="2">
153    <a class="nav-link" href="../haskell/exceptions.html">Exceptions</a>
154  </li>
155  <li class="nav-item" data-depth="2">
156    <a class="nav-link" href="../haskell/lens.html">Lens</a>
157  </li>
158  <li class="nav-item" data-depth="2">
159    <a class="nav-link" href="../haskell/dhall.html">Dhall</a>
160  </li>
161  <li class="nav-item" data-depth="2">
162    <a class="nav-link" href="../haskell/turtle.html">Turtle</a>
163  </li>
164  <li class="nav-item" data-depth="2">
165    <a class="nav-link" href="../haskell/pipes.html">Pipes</a>
166  </li>
167  <li class="nav-item" data-depth="2">
168    <a class="nav-link" href="../haskell/shake.html">Shake</a>
169  </li>
170  <li class="nav-item" data-depth="2">
171    <a class="nav-link" href="../haskell/extensions.html">Extensions</a>
172  </li>
173  <li class="nav-item" data-depth="2">
174    <a class="nav-link" href="../haskell/gats.html">GADTs</a>
175  </li>
176  <li class="nav-item" data-depth="2">
177    <a class="nav-link" href="../haskell/intero.html">Intero</a>
178  </li>
179</ul>
180  </li>
181  <li class="nav-item" data-depth="1">
182    <a class="nav-link" href="../salt/index.html">Salt</a>
183  </li>
184  <li class="nav-item" data-depth="1">
185    <a class="nav-link" href="../editors/spacemacs.html">Spacemacs</a>
186  </li>
187  <li class="nav-item" data-depth="1">
188    <a class="nav-link" href="../git/index.html">Git</a>
189  </li>
190  <li class="nav-item" data-depth="1">
191    <a class="nav-link" href="../linux/index.html">Linux</a>
192  </li>
193  <li class="nav-item" data-depth="1">
194    <a class="nav-link" href="../purescript/index.html">Purescript</a>
195  </li>
196  <li class="nav-item" data-depth="1">
197    <a class="nav-link" href="../postgres/index.html">Postgres</a>
198  </li>
199  <li class="nav-item" data-depth="1">
200    <a class="nav-link" href="../cloud/aws.html">AWS</a>
201  </li>
202  <li class="nav-item" data-depth="1">
203    <a class="nav-link" href="../cicd/index.html">CICD</a>
204  </li>
205  <li class="nav-item" data-depth="1">
206    <button class="nav-item-toggle"></button>
207    <span class="nav-text">Infra</span>
208<ul class="nav-list">
209  <li class="nav-item" data-depth="2">
210    <a class="nav-link" href="../infra/network.html">Network</a>
211  </li>
212  <li class="nav-item" data-depth="2">
213    <a class="nav-link" href="../infra/storage.html">Storage</a>
214  </li>
215  <li class="nav-item" data-depth="2">
216    <a class="nav-link" href="../infra/vmware.html">VMware</a>
217  </li>
218</ul>
219  </li>
220  <li class="nav-item" data-depth="1">
221    <a class="nav-link" href="../notions/index.html">Glossary</a>
222  </li>
223</ul>
224  </li>
225</ul>
226  </nav>
227</div>
228<div class="nav-panel-explore" data-panel="explore">
229  <div class="context">
230    <span class="title">Notebook</span>
231    <span class="version">master</span>
232  </div>
233  <ul class="components">
234    <li class="component is-current">
235      <a class="title" href="index.html">Notebook</a>
236      <ul class="versions">
237        <li class="version is-current is-latest">
238          <a href="index.html">master</a>
239        </li>
240      </ul>
241    </li>
242  </ul>
243</div>
244    </div>
245  </aside>
246</div>
247<main class="article">
248<div class="toolbar" role="navigation">
249<button class="nav-toggle"></button>
250  <a href="index.html" class="home-link is-current"></a>
251<nav class="breadcrumbs" aria-label="breadcrumbs">
252  <ul>
253    <li><a href="index.html">Notebook</a></li>
254    <li><a href="index.html">Nix</a></li>
255  </ul>
256</nav>
257  <div class="edit-this-page"><a href="file:///home/vagrant/projects/pi3r/notebook/modules/ROOT/pages/nix/index.adoc">Edit this Page</a></div>
258</div>
259  <div class="content">
260<article class="doc">
261<h1 class="page">Nix</h1>
262<div id="preamble">
263<div class="sectionbody">
264<div class="paragraph">
265<p>Nix is not a configuration management tool alike <code>Puppet</code> or <code>Chef</code>.
266It is more accurately described as a (universal) package manager or build tool.</p>
267</div>
268<div class="paragraph">
269<p>Nix operates within its store (usually located in '/nix') to gather packages called <code>derivations</code>.
270In that regard, unless you are running <code>nixos</code>, nix won&#8217;t configure systemd services for instance.</p>
271</div>
272<div class="paragraph">
273<p>Nix aims to offer:</p>
274</div>
275<div class="ulist">
276<ul>
277<li>
278<p>best possible build reproducibility</p>
279</li>
280<li>
281<p>self-contained environments</p>
282</li>
283<li>
284<p>easy rollback</p>
285</li>
286<li>
287<p>composability</p>
288</li>
289</ul>
290</div>
291</div>
292</div>
293<div class="sect1">
294<h2 id="_tips_and_tricks"><a class="anchor" href="#_tips_and_tricks"></a>Tips and tricks</h2>
295<div class="sectionbody">
296<div class="dlist">
297<dl>
298<dt class="hdlist1">Overlays</dt>
299<dd>
300<p>You can override derivation attributes in user space without forking the nixpkgs repository by using one or multiple overlays:</p>
301<div class="listingblock">
302<div class="title">~/.config/nixpgks/overlays/default.nix</div>
303<div class="content">
304<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">self: super:
305let
306  hlib = super.haskell.lib;
307in
308{
309  haskellPackages = super.haskellPackages.override {
310    overrides =  curr: prev: {
311      cicd-shell = hlib.dontCheck (hlib.dontHaddock
312        (curr.callCabal2nix "cicd-shell" (super.fetchgit { <i class="conum" data-value="1"></i><b>(1)</b>
313           url = "http://stash.cirb.lan/scm/cicd/cicd-shell.git";
314           rev = "d76c532d69e4d01bdaf2c716533d9557371c28ea";
315           sha256 = "0yval6k6rliw1q79ikj6xxnfz17wdlnjz1428qbv8yfl8692p13h";
316         }) {
317              protolude = prev.protolude_0_2;
318            }
319        ));
320      };
321    };
322}</code></pre>
323</div>
324</div>
325<div class="colist arabic">
326<table>
327<tr>
328<td><i class="conum" data-value="1"></i><b>1</b></td>
329<td><code>callCabal2nix</code> allows to automatically fetch and build any haskell package from the web</td>
330</tr>
331</table>
332</div>
333</dd>
334<dt class="hdlist1">Pinned a version of nixpkgs</dt>
335<dd>
336<div class="listingblock">
337<div class="content">
338<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">let
339  nixpkgs = builtins.fromJSON (builtins.readFile ./.nixpkgs.json);
340in
341import (fetchTarball {
342  url = "https://github.com/NixOS/nixpkgs/archive/${nixpkgs.rev}.tar.gz";
343  inherit (nixpkgs) sha256;
344})</code></pre>
345</div>
346</div>
347<div class="paragraph">
348<p>Updating <code>.nixpkgs.json</code> is realized with such a zsh function:</p>
349</div>
350<div class="listingblock">
351<div class="content">
352<pre class="highlightjs highlight"><code>function updateNixpkgs () {
353    nix-prefetch-git https://github.com/NixOS/nixpkgs.git "$1" &gt; ~/.config/nixpkgs/.nixpkgs.json
354}</code></pre>
355</div>
356</div>
357<div class="paragraph">
358<p>It is easier to manage pinned/sha using <a href="https://github.com/nmattia/niv">niv</a>.</p>
359</div>
360</dd>
361<dt class="hdlist1">Private packages</dt>
362<dd>
363<div class="paragraph">
364<p>You can also extend <code>nixpkgs</code> with private derivations without any forking. For instance using a custom file:</p>
365</div>
366<div class="listingblock">
367<div class="title">dotfiles.nix</div>
368<div class="content">
369<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">with import &lt;nixpkgs&gt; {}; <i class="conum" data-value="1"></i><b>(1)</b>
370
371let xmonadEnv = haskellPackages.ghcWithPackages (p: with p; [xmonad xmonad-contrib]); <i class="conum" data-value="2"></i><b>(2)</b>
372in
373
374stdenv.mkDerivation {
375  name = "devbox_dotfiles-0.1";
376
377  src = fetchFromGitHub {
378    owner = "CIRB";
379    repo = "devbox-dotfiles";
380    rev = "801f66f3c7d657f5648963c60e89743d85133b1a" ;
381    sha256 = "1w4vaqp21dmdd1m5akmzq4c3alabyn0mp94s6lqzzp1qpla0sdx0" ;
382  };
383
384  buildInputs = [ xmonadEnv ];
385
386  installPhase = ''
387    ${xmonadEnv}/bin/ghc --make .xmonad/xmonad.hs -o .xmonad/xmonad-x86_64-linux <i class="conum" data-value="3"></i><b>(3)</b>
388    cp -R ./. $out <i class="conum" data-value="4"></i><b>(4)</b>
389  '';
390
391  meta = {
392    description = "Dot files for the devbox";
393  };
394}</code></pre>
395</div>
396</div>
397<div class="colist arabic">
398<table>
399<tr>
400<td><i class="conum" data-value="1"></i><b>1</b></td>
401<td>dependencies provided by <code>nixpkgs</code> using $NIX_PATH</td>
402</tr>
403<tr>
404<td><i class="conum" data-value="2"></i><b>2</b></td>
405<td>ghc with module deps included</td>
406</tr>
407<tr>
408<td><i class="conum" data-value="3"></i><b>3</b></td>
409<td>at this stage, the shell is inside a temp dir with the src included</td>
410</tr>
411<tr>
412<td><i class="conum" data-value="4"></i><b>4</b></td>
413<td>copy the content of the current dir into $out</td>
414</tr>
415</table>
416</div>
417<div class="paragraph">
418<p>You then build the derivation or install it in the user environment.</p>
419</div>
420<div class="listingblock">
421<div class="content">
422<pre class="highlightjs highlight"><code>→ nix-build dotfiles.nix
423→ nix-env -f dotfiles.nix -i devbox_dotfiles <i class="conum" data-value="1"></i><b>(1)</b></code></pre>
424</div>
425</div>
426<div class="colist arabic">
427<table>
428<tr>
429<td><i class="conum" data-value="1"></i><b>1</b></td>
430<td><code>nix-env -i</code> takes the name attribute and strip the version (first numeric after <code>-</code>)</td>
431</tr>
432</table>
433</div>
434</dd>
435<dt class="hdlist1">Overrides haskell packages for the <code>ghc821</code> compiler</dt>
436<dd>
437<div class="listingblock">
438<div class="content">
439<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">self: super:
440let
441  hlib = super.haskell.lib;
442in
443{
444haskell = super.haskell // { packages = super.haskell.packages // { ghc821 = super.haskell.packages.ghc821.override { <i class="conum" data-value="1"></i><b>(1)</b>
445   overrides =  hpkgs: _hpkgs: {
446     containers = hlib.dontCheck(_hpkgs.containers);
447   };
448};};};
449}</code></pre>
450</div>
451</div>
452<div class="colist arabic">
453<table>
454<tr>
455<td><i class="conum" data-value="1"></i><b>1</b></td>
456<td><code>haskell</code> equals <code>super.haskell</code> except packages, which equals <code>super.haskell.packages</code> except for <code>ghc821</code>, which is the overriden version of <code>super 821</code></td>
457</tr>
458</table>
459</div>
460</dd>
461<dt class="hdlist1">Caching the list of all available package into a local file</dt>
462<dd>
463<div class="listingblock">
464<div class="content">
465<pre class="highlightjs highlight"><code>nix-env -qaP --description '*' &gt; ~/allpkgs.desc</code></pre>
466</div>
467</div>
468</dd>
469<dt class="hdlist1">Reproduce any hydra build locally</dt>
470<dd>
471<div class="listingblock">
472<div class="content">
473<pre class="highlightjs highlight"><code>bash &lt;(curl https://hydra.nixos.org/build/57055021/reproduce)</code></pre>
474</div>
475</div>
476</dd>
477<dt class="hdlist1">Installed nixpkgs version</dt>
478<dd>
479<p>nix-instantiate --eval -E '(import &lt;nixpkgs&gt; {}).lib.version'</p>
480</dd>
481<dt class="hdlist1">Refering to an attribute that contains dot (e.g: <code>foo-1.2.0</code>)</dt>
482<dd>
483<p>You will need to escape the <code>.</code>:</p>
484</dd>
485</dl>
486</div>
487<div class="listingblock">
488<div class="content">
489<pre class="highlightjs highlight"><code>nix-build -A '"foo-1.2.0"'</code></pre>
490</div>
491</div>
492<div class="dlist">
493<dl>
494<dt class="hdlist1">Convert an attribute set into a string representation</dt>
495<dd>
496<p>Attribute set are not automatically converted into string.
497That said, you can provide an implementation by using the <mark>outPath</mark> field:</p>
498</dd>
499</dl>
500</div>
501<div class="listingblock">
502<div class="content">
503<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">builtins.fromJSON fromCUE // { outPath = fromCUE; }</code></pre>
504</div>
505</div>
506</div>
507</div>
508<div class="sect1">
509<h2 id="_pitfall"><a class="anchor" href="#_pitfall"></a>Pitfall</h2>
510<div class="sectionbody">
511<div class="paragraph">
512<p>When you create a derivation, a path value will auto-magically be interpolated 
512with its generated outpath:</p>
513</div>
514<div class="listingblock">
515<div class="content">
516<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">pkgs.runCommand "hello" { buildInputs = []; } ''
517  cp ${./talk.adoc} $out <i class="conum" data-value="1"></i><b>(1)</b>
518''</code></pre>
519</div>
520</div>
521<div class="colist arabic">
522<table>
523<tr>
524<td><i class="conum" data-value="1"></i><b>1</b></td>
525<td>path &#8594; /nix/store/xxxx</td>
526</tr>
527</table>
528</div>
529<div class="paragraph">
530<p>The tricky part arises when you want to use a string variable to describe this path. To force the coersing from string &#8594; path you need to use <mark>+</mark>:</p>
531</div>
532<div class="listingblock">
533<div class="content">
534<pre class="highlightjs highlight"><code class="language-nix hljs" data-lang="nix">let
535  cueSchema = "${config.home.homeDirectory}/bootstrap/user/schema.cue";
536  cueConfig = "${sharedDir}/box.cue";
537in
538pkgs.runCommand "fromCue" { } ''
539  ${pkgs.cue}/bin/cue export ${/. + cueSchema } ${/. + cueConfig} &gt; $out;
540''</code></pre>
541</div>
542</div>
543</div>
544</div>
545<div class="sect1">
546<h2 id="_references"><a class="anchor" href="#_references"></a>References</h2>
547<div class="sectionbody">
548<div class="ulist">
549<ul>
550<li>
551<p><a href="http://lethalman.blogspot.be/search/label/nixpills">nix pills</a></p>
552</li>
553<li>
554<p><a href="http://sandervanderburg.blogspot.be/2014/07/managing-private-nix-packages-outside.html">private packages</a></p>
555</li>
556<li>
557<p><a href="https://nixcloud.io/tour/?id=1" class="bare">https://nixcloud.io/tour/?id=1</a></p>
558</li>
559</ul>
560</div>
561</div>
562</div>
563</article>
564<aside class="toc sidebar" data-title="Contents" data-levels="2">
565  <div class="toc-menu"></div>
566</aside>
567  </div>
568</main>
569</div>
570<!-- at the end of the BODY -->
571<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
vendor: 1 bytes, line 571
571
572<script type="text/javascript"> docsearch({
573     appId: 'QDHVLDHCUH',
574     apiKey: '1e23c2bd81f202e353569a29de2026a2',
575     indexName: 'pi3r-docs',
576     inputSelector: '#search-input',
577     autocompleteOptions: { hint: false, keyboardShortcuts: ['s'] },
578     debug: false // Set debug to true if you want to inspect the dropdown
579 });
580</script>
vendor: 1 bytes, line 580
580
581<script src="../../_/js/site.js"></script>
vendor: 1 bytes, line 581
581
582<script async src="../../_/js/vendor/highlight.js"></script>
582
583  </body>
584</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.