— user@ocaml-programming —
user@ocaml-programming $ cat ./ocaml-programming.md (main)

ocaml-programming

# OCaml für die Praxis — eine Tutorial-Reihe.

~/ / 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.