~/ / docs / Praxis / 07 · Praxis
Build-Setup mit dune
dune-project, dune-Dateien und die wichtigsten Stanzas — vom leeren Verzeichnis zum lauffähigen Mehrkomponenten-Projekt.
dune ist das Build-System der Wahl in der OCaml-Welt — schnell, deklarativ und mit klarem Inkrementalverhalten. Statt Makefiles zu schreiben, deklariert man, was es gibt; den Rest übernimmt dune.
Projekt anlegen
Ein dune-Projekt braucht zwei Dinge: eine Datei dune-project an der Wurzel und eine dune in jedem Verzeichnis mit Source-Code. Schnellstart:
mkdir hello && cd hello
opam exec -- dune init project hello
Das erzeugt eine Standardstruktur — bin/ für ausführbare Programme, lib/ für wiederverwendbare Bibliotheken, test/ für Tests. Die dune-project-Datei beschreibt das gesamte Projekt:
(lang dune 3.14)
(name hello)
Executables und Libraries
In bin/dune wird ein ausführbares Programm deklariert. Die Stanza executable benennt die Hauptkomponente und ihre Abhängigkeiten:
(executable
(name main)
(public_name hello)
(libraries hello))
(name main) verweist auf bin/main.ml. (libraries hello) macht die Bibliothek aus lib/ verfügbar. In lib/dune steht entsprechend:
(library
(name hello)
(public_name hello))
Damit ist Hello-Modul aus bin/main.ml zugänglich:
let () = print_endline (Hello.greeting "OCaml")
Bauen und Ausführen
dune denkt in Targets, baut aber von sich aus alles, was es findet. Drei Befehle braucht man wirklich oft:
dune build # alles bauen
dune exec hello # executable ausführen
dune runtest # Tests laufen lassen
Während der Entwicklung lohnt der Watch-Modus — dune kompiliert bei jeder Änderung automatisch:
dune build --watch
Tests
Tests sind eine eigene Stanza. In test/dune:
(test
(name test_hello)
(libraries hello alcotest))
In test/test_hello.ml:
let test_greeting () =
Alcotest.(check string) "begrüßt"
"Hallo, OCaml" (Hello.greeting "OCaml")
let () =
Alcotest.run "hello"
[ "greeting", [ Alcotest.test_case "ok" `Quick test_greeting ] ]
alcotest wird einmalig nachinstalliert — typisch für Testbibliotheken in OCaml:
opam install alcotest
Abhängigkeiten von außen
Externe Pakete deklariert man entweder in der entsprechenden dune-Datei unter (libraries ...) oder zusätzlich in der .opam-Datei des Projekts, damit opam install sie ziehen kann. Für die meisten Entwicklungsprojekte reicht die dune-Seite — opam wird relevant, sobald man veröffentlicht.
Mit diesem Setup steht eine saubere Projektstruktur. Im letzten Kapitel der Reihe wird daraus ein kleines, aber komplettes CLI-Tool.