git.iko.soy/typeable/cabal2nix
on v2.7.2 help sign in
typeable/cabal2nix/doc/hal8-folien.md
289 lines 8.7 kB history raw
1% Managing the Haskell Dependency Hell with Nix
2% Peter Simons \<simons@cryp.to\>
3% 2013-06-21
5-------------------------------------------------------------------------------
7# Ablauf der Präsentation
91) Vorstellung des Nix Paket-Managers
11 - Übersicht der besonderen Features
12 - Die Paket-Datenbank
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
265) Fragen & Antworten
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-------------------------------------------------------------------------------
72# Die Paketdatenbank
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
84 -> IO StorePath
86- Nixpkgs bietet verschiedene `mkDerivation`-Wrapper, um die Verwendung
87von `derivation` vereinfachen.
89-------------------------------------------------------------------------------
91# Das Paket `parsec-3.1.3`
93 { cabal, mtl, text }:
95 cabal.mkDerivation (self: {
96 pname = "parsec";
97 version = "3.1.3";
98 sha256 = "1a64gzirgpa1i78gbbp9z059nh29xmcja4g8vgjb1";
99 buildDepends = [ mtl text ];
100 })
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
113 [...]
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
126 }:
127 cabal.mkDerivation (self: {
128 pname = "yesod";
129 version = "1.2.1";
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
136 ];
137 })
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; }
157- Let-Statements:
159 let append = { list ? [], element }: list++[element];
160 in append { list = ["abc" 3]; element = null; }
162- With-Statements: `with { foo = "foobar"; }; foo`
164-------------------------------------------------------------------------------
166# Haskell in Nixpkgs
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
193 [...]
195 $ export PATH=~/ghc-7.6.3/bin:~/ghc-7.4.2/bin:...:$PATH
197 $ ghc --version
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
214 {
215 packageOverrides = pkgs:
216 {
217 ghcEnv = with pkgs.haskellPackages_ghc763;
218 ghcWithPackages (self: [
219 parsec xmonad hsdns
220 ]);
221 };
222 }
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
242aller Abhängigkeiten.
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`
2502) `mkdir foobar`
2513) `cabal2nix cabal://foobar >foobar/default.nix`
2524) `cd ../../../`
2535) In `pkgs/top-level/haskell-packages.nix` die Zeile
255 foobar = callPackage
256 ../development/libraries/haskell/foobar {};
258 einfügen.
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,
275BSD, etc. ausführen.
277-------------------------------------------------------------------------------
279# Noch Fragen?
281- `https://nixos.org/`
283- `https://github.com/nixos/`
285- `http://nixos.org/wiki/Haskell`
287- `https://groups.google.com/forum/#!forum/nix-devel`
289- `#nixos` auf `irc.freenode.org`