1% Managing the Haskell Dependency Hell with Nix
2% Peter Simons \<simons@cryp.to\>
5-------------------------------------------------------------------------------
7# Ablauf der Präsentation
91) Vorstellung des Nix Paket-Managers
11 - Übersicht der besonderen Features
13 - Nix als Programmiersprache
152) Installation von Haskell-Paketen
17 - Einfache Installation
18 - Mehrere Versionen gleichzeitig installieren
19 - Funktionsweise von `ghc-wrapper`
20 - Nix in Kombination mit `cabal-dev`
223) Erweiterung der Nix Paket-Datenbank mit `cabal2nix`
244) Continuous-Integration mit der Hydra Build-Farm
28-------------------------------------------------------------------------------
30# Was ist Nix und warum will ich das wissen?
32- Nix ist ein rein funktionaler Paket-Manager.
34- Nix kann mehrere Paket-Versionen gleichzeitig installieren.
36- Nix garantiert, dass alle Paket-Abhängigkeiten bekannt sind.
38- Nix erlaubt atomische Updates.
40- Nix erlaubt das Zurücknehmen von Updates.
42- Nix erlaubt die Installation von Binär-Paketen.
44- Nix ist unabhängig vom Betriebsystem.
46- Nix hat erstklassige Unterstützung für Multi-User-Systeme.
48- Nix ist freie Software unter GNU LGPL 2.1.
50-------------------------------------------------------------------------------
52# Wie sieht eine Nix-Installation aus?
54- Nix lebt komplett unterhalb des Verzeichnisses `/nix`.
56 - Nix deinstallieren: `rm -rf /nix`
57 - Backup erstellen: `tar cfz nix-backup.tar.gz /nix`
59- Meta-Daten liegen unterhalb von `/nix/var`.
61- Alle Pakete werden unterhalb von `/nix/store` installiert:
63 /nix/store/3768znryvs7nmnr3p2cdlr95hj-ghc-6.12.3
64 /nix/store/8z0v9s56nc2f5zgdn6hgzchwba-ghc-7.0.4
65 /nix/store/njwikqrziy7nsc18bpxlvncq1q-ghc-7.6.3
67- In `/nix/store` installierte Pakete referenzieren niemals
68 Dateien außerhalb des Stores.
70-------------------------------------------------------------------------------
74- Nixpkgs ist eine Sammlung von Build-Rezepten, die in der rein
75funktionalen Sprache *Nix* geschrieben sind.
77- Ein Paket wird erzeugt durch die Funktion `derivation`:
79 derivation :: String -- Arch-OS
80 -> String -- Name-Version
81 -> [String] -- Build-Kommando
82 -> [StorePath] -- Abhängigkeiten
83 -> [(String,String)] -- Shell-Umgebung
86- Nixpkgs bietet verschiedene `mkDerivation`-Wrapper, um die Verwendung
87von `derivation` vereinfachen.
89-------------------------------------------------------------------------------
91# Das Paket `parsec-3.1.3`
95 cabal.mkDerivation (self: {
98 sha256 = "1a64gzirgpa1i78gbbp9z059nh29xmcja4g8vgjb1";
99 buildDepends = [ mtl text ];
102-------------------------------------------------------------------------------
104# Installation von `parsec-3.1.3`
106 $ nix-env -iA haskellPackages.parsec_3_1_3
107 installing `haskell-parsec-ghc7.6.3-3.1.3'
108 these paths will be fetched:
109 /nix/store/09zlb...-haskell-parsec-ghc7.6.3-3.1.3
110 /nix/store/4p1rb...-haskell-mtl-ghc7.6.3-2.1.2
111 /nix/store/i0k3s...-haskell-text-ghc7.6.3-0.11.3.1
112 /nix/store/q8163...-haskell-transformers-ghc7.6.3-0.3.0.0
114 building path(s) `/nix/store/0xfxh...-user-environment'
115 created 22 symlinks in user environment
117-------------------------------------------------------------------------------
119# Das Paket für `yesod-1.2.1`
121 { cabal, aeson, blazeHtml, blazeMarkup, dataDefault,
122 , hamlet monadControl, networkConduit, safe,
123 , shakespeareCss shakespeareJs text, transformers,
124 , unorderedContainers wai, waiExtra, warp yaml,
125 , yesodAuth, yesodCore yesodForm, yesodPersistent
127 cabal.mkDerivation (self: {
130 sha256 = "19gwhav6sr6gd2kh92ga8a09hq9grllmnacdqk6zg";
131 buildDepends = [ aeson blazeHtml blazeMarkup
132 dataDefault hamlet monadControl networkConduit safe
133 shakespeareCss shakespeareJs text transformers
134 unorderedContainers wai waiExtra warp yaml yesodAuth
135 yesodCore yesodForm yesodPersistent
139-------------------------------------------------------------------------------
141# Die Programmiersprache Nix
143- Nix ist lazy-evaluiertes, ungetyptes Lambda-Kalkül.
145- Strings: `"hello world"`, `http://example.org/`
147- Listen: `[ 12 "abc" http://example.org ]`
149- Funktionen: `list: element: list ++ [element]`
151- Dictionaries: { foo = "foo"; foo = "bar; }
153- Rekursive Dictionaries:
155 rec { bar = "foo"; bar = "bar; foobar = foo + bar; }
159 let append = { list ? [], element }: list++[element];
160 in append { list = ["abc" 3]; element = null; }
162- With-Statements: `with { foo = "foobar"; }; foo`
164-------------------------------------------------------------------------------
168- Unterstützt werden Haskell Platform 2009.2.0.2, 2010.1.0.0,
1692010.2.0.0, 2011.2.0.0, 2011.2.0.1, 2011.4.0.0, 2012.2.0.0, 2012.4.0.0
170und 2013.2.0.0 auf Linux und Darwin.
172- Mehr als 850 Bibliotheken von Hackage:
174 nix-env -qaP \* | grep haskellPackages
176- Haskell Platform installieren:
178 nix-env -iA haskellPackages.haskellPlatform
179 nix-env -iA haskellPackages_ghc763.haskellPlatform
181- Pakete von Hackage installieren:
183 nix-env -iA haskellPackages_ghc763.cabalInstall
184 nix-env -iA haskellPackages_ghc763.darcs
186-------------------------------------------------------------------------------
188# Mehrere GHC Versionen installieren
190 $ nix-env -p ~/ghc-7.6.3 -iA haskellPackages_ghc763.ghc
191 $ nix-env -p ~/ghc-7.4.2 -iA haskellPackages_ghc742.ghc
192 $ nix-env -p ~/ghc-7.0.4 -iA haskellPackages_ghc704.ghc
195 $ export PATH=~/ghc-7.6.3/bin:~/ghc-7.4.2/bin:...:$PATH
198 The Glorious Glasgow Haskell Compiler, version 7.6.3
200 $ ghc-7.0.4 --version
201 The Glorious Glasgow Haskell Compiler, version 7.0.4
203-------------------------------------------------------------------------------
205# Wie findet `ghc` die installierten Bibliotheken?
207- `ghc-wrapper` findet zur Laufzeit alle Pakete, die im selben Profil
208installiert sind wie der Wrapper selber.
210- `ghcWithPackages` baut einen speziellen Wrapper, dessen Paket-Liste
211statisch konfiguriert ist:
213 # ~/.nixpkgs/config.nix
215 packageOverrides = pkgs:
217 ghcEnv = with pkgs.haskellPackages_ghc763;
218 ghcWithPackages (self: [
224- `cabal-install` und `cabal-dev` funktionieren wunderbar mit
225`ghcWithPackages`, mit `ghc-wapper` aber nur so mittel.
227-------------------------------------------------------------------------------
229# Wie erweitert man Nixpkgs um neue Haskell-Pakete?
231- `cabal2nix` generiert Build-Instruktionen für Nix automatisch:
233 $ nix-env -iA haskellPackages.cabal2nix
234 $ cabal2nix cabal://pkgname-version
235 $ cabal2nix cabal://pkgname # neueste Version
237- `--no-haddock` schaltet das Generieren der Haddock-Dokumentation aus.
239- `--no-check` schaltet die Test-Suite aus.
241- `--jailbreak` löscht in der Cabal-Datei die Versions-Einschränkungen
244-------------------------------------------------------------------------------
246# Wie erweitert man Nixpkgs um neue Haskell-Pakete?
2481) `git checkout git://github.com/NixOS/nixpkgs.git`
2492) `cd pkgs/development/libraries/haskell`
2513) `cabal2nix cabal://foobar >foobar/default.nix`
2535) In `pkgs/top-level/haskell-packages.nix` die Zeile
256 ../development/libraries/haskell/foobar {};
2596) `nix-env -f . -iA haskellPackages.foobar`
261-------------------------------------------------------------------------------
263# Die Hydra Build-Farm
265- `http://hydra.nixos.org/` ist die Haupt-Buildfarm von Nix.
267- Eigene Hydra-Instanzen können über Nix installiert werden.
269- Im Fehlerfall benachrichtigt Hydra den Inhaber des Pakets.
271- Alle erfolgreich gebauten Pakete können von Nix-Nutzern in Binärform
272heruntergeladen werden.
274- Hydra kann verteilte Builds auf den Plattformen Linux, Darwin, Cygwin,
277-------------------------------------------------------------------------------
281- `https://nixos.org/`
283- `https://github.com/nixos/`
285- `http://nixos.org/wiki/Haskell`
287- `nix-dev@lists.science.uu.nl`
289- `#nixos` auf `irc.freenode.org`
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list