Hallo Cargo!

Cargo ist ein Werkzeug, welches Rustler benutzen um ihre Rust Projekte zu verwalten. Cargo ist derzeit in einem pre-1.0 Zustand und ist somit immer noch in Arbeit. Jedoch ist es bereits gut genug es für viele Rust Projekte einzusetzen und somit wird vorausgesetzt, dass Rust Projekte Cargo von Anfang an einsetzen.

Cargo verwaltet drei Sachen: Das bauen des Codes, das Herunterladen der Abhängigkeiten, welche dein Projekt benötigt und das Bauen dieser Abhängigkeiten. Zu Anfang hat dein Programm keine Abhängigkeiten. Also wirst du nur den ersten Teil an Funktionalität nutzen. Später wirst du komplexere Programme mit einigen Abhängigkeiten erstellen und dann macht es sich bezahlt, dass du Cargo von Anfang an genutzt hast.

Wenn du Rust mit dem offiziellen Installer installiert hast, dann wirst du auch Cargo haben. Wenn du allerdings Rust auf eine andere Art und Weise installiert hast, dann möchtest du möglicherweise einen Blick in die Cargo README werfen um herauszufinden, wie man Cargo installiert.

Nach Cargo umwandeln

Lass uns unser 'Hallo Welt'-Projekt nach Cargo umwandeln.

Um ein Projekt zu "Cargoifizieren" benötigen wir drei Dinge: Erstelle eine Cargo.toml Konfigurationsdatei, lege die Quelltexte an den richtigen Platz und entferne die alte ausführbare Datei (main.exe unter Windows, main sonst wo). Lass uns den ersten Teil zuerst machen:

$ mkdir src
$ mv main.rs src/main.rs
$ rm main  # oder main.exe unter Windows

Da wir eine ausführbare Datei erstellen behalten wir main.rs als Dateiname bei. Wenn wir stattdessen eine Bibliothek erstellen wollten, müssten wir lib.rs verwenden. Diese Konvention wird von Cargo benutzt um unsere Projekte erfolgreich zu kompilieren. Wenn wir wollen, dann können wir diese Konvention auch außer Kraft setzen.

Cargo erwartet, dass deine Quelltexte in einem src-Verzeichnis liegen. Das lässt das oberste Verzeichnis für andere Sachen wie READMEs, Lizenzinformationen und anderen Dingen, die nichts mit deinem Code zu tun haben, frei.

Als nächstes unsere Konfigurationsdatei:

$ editor Cargo.toml

Stelle sicher, dass der Name korrekt ist: Das große C ist notwendig!

Schreib das hier hinein:

[package]

name = "hallo_welt"
version = "0.0.1"
authors = [ "Dein Name <du@example.com>" ]

Diese Datei ist im TOML-Format. TOML ist ähnlich wie INI, aber hat ein paar tolle Extra-Funktionen. Der TOML-Dokumentation zufolge

Zielt TOML darauf ab ein minimales Konfigurationsformat zu sein, welches aufgrund seiner offensichtlichen Semantik, leicht zu lesen ist. TOML ist dazu designt eindeutig auf eine Hashtabelle abzubilden. Toml sollte in einer breiten Vielzahl von Sprachen leicht in Datenstrukturen zu parsen sein.

Sobald wir diese Datei im Wurzelverzeichnis unseres Projektes haben, sind wir auch schon bereit es zu bauen! Um das zu tun, führe dies aus:

$ cargo build
   Compiling hallo_welt v0.0.1 (file:///home/deinname/projekte/hallo_welt)
$ ./target/debug/hallo_welt
Hallo Welt!

Bumm! Wir haben unser Projekt mit cargo build gebaut und es mit ./target/debug/hallo_welt ausgeführt. Wir können beides auch in einem einzigen Schritt machen mittels cargo run:

$ cargo run
     Running `target/debug/hallo_welt`
Hallo Welt!

Beachte, dass dieses mal das Projekt nicht neu kompiliert wurde. Cargo hat selber herausgefunden, dass wir den Quelltext nicht verändert haben und hat einfach nur die Binärdatei ausgeführt. Hätten wir eine Veränderung vorgenommen, dann hätten wir beides gesehen:

$ cargo run
   Compiling hallo_welt v0.0.1 (file:///home/deinname/projekte/hallo_welt)
     Running `target/debug/hallo_welt`
Hallo Welt!

Dies hat uns nicht viel mehr eingebracht als einfach nur rustc zu benutzen. Aber denk an Zukunft: Wenn unser Projekt komplexer wird, dann müssen wir mehr machen um alle Teile zusammen ordentlich zum Kompilieren zu bringen. Mit Cargo können wir, während unser Projekt wächst, einfach cargo build aufrufen und unser Projekt wird sofort auf die richtige Art und Weise gebaut.

Wenn unser Projekt dann endlich fertig zum Release ist, kannst du einfach cargo build --release benutzen um dein Projekt mit Optimierungen zu kompilieren.

Du wirst auch feststellen, dass Cargo eine neue Datei erzeugt hat: Cargo.lock.

[root]
name = "hello_world"
version = "0.0.1"

Die Cargo.lock-Datei wird von Cargo benutzt, um deine Abhängigkeit zu verfolgen. Im Moment haben wir keine, also ist sie etwas dürftig. Du wirst diese Datei niemals selber anfassen müssen. Lass einfach Cargo die Sache regeln.

Das wars! Wir haben hallo_welt erfolgreich mit Cargo gebaut. Obwohl das Programm simpel ist, benutzt es viele der Werkzeuge die du für den Rest deiner Rust-Karriere brauchst. Du kannst erwarten, dass du mit nahezu allen Rust-Projekten so loslegen kannst:

$ git clone someurl.com/foo
$ cd foo
$ cargo build

Ein neues Projekt

Du brauchst nicht jedes mal durch alle diese Schritte gehen, wenn du ein neues Projekt anfängst! Cargo hat die Fähigkeit ein Gerüst-Projekt zu erzeugen, mit dem du sofort anfangen kannst zu entwickeln.

Um eine neues Projekt mit Cargo anzufangen benutze cargo new:

$ cargo new hallo_welt --bin

Wir übergeben --bin, da es unser Ziel ist eine ausführbare Anwendung, anstatt einer Bibliothek, zu erzeugen. Ausführbare Dateien werden oft ‘binaries’ genannt. (So wie in /usr/bin, falls du auf einem Unix System bist).

Lass uns mal sehen welche Dateien Cargo für uns erzeugt hat:

$ cd hallo_welt
$ tree .
.
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files

Falls du den tree-Befehl nicht hast, dann kannst du ihn dir wahrscheinlich mit hilfe der Paketverwaltung deiner Distribution besorgen. Der Befehl ist nicht notwendig, aber sicherlich nützlich.

Das ist alles was wir brauchen um loszulegen. Lass uns zuerst die Cargo.toml betrachten.

[package]

name = "hallo_welt"
version = "0.1.0"
authors = ["Dein Name <du@example.com>"]

Cargo hat diese Datei mit einigen Vorgaben, basierend auf den von dir übergebenen Argumenten und deiner globalen git-Konfiguration, gefüllt. Du wirst vielleicht bemerken, dass Cargo das hallo_welt-Verzeichnis auch als git-Repository initialisiert hat.

Das hier steht in der src/main.rs:

fn main() {
    println!("Hello, world!");
}

Cargo hat ein "Hallo Welt!" für uns erzeugt und du kannst sofort mit dem Coden loslegen! Cargo hat seinen eigenen Guide, welcher die Features von Cargo in größerem Detail behandelt.

Da du nun mit den Werkzeugen vertraut bist, lass uns tatsächlich mehr über die Sprache Rust selbst lernen. Dies sind die Grundlagen, welche dir den Rest deiner Zeit mit Rust sehr dienlich sein werden.

Du hast Zwei Möglichkeiten: Entweder stürzt du dich in ein Projekt mit ‘Lerne Rust’, oder du arbeitest dir deinen Weg von unten nach oben mit ‘Syntax und Semantik’. Erfahrene Systemprogrammierer werden ‘Lerne Rust’ mit sicherheit vorziehen, während Leute mit Hintergrund in dynamischen Sprachen beides bevorzugen könnten. Verschiedene Leute lernen verschieden! Wähle was Dir am besten liegt.