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’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" > ~/.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 <nixpkgs> {}; <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 '*' > ~/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 <(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 <nixpkgs> {}).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 → /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 → 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} > $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.