Rust: Crates und Continuous Integration – eine perfekte Mischung

Rust verpackt Sourcecode in Kistchen, deren Abhängigkeiten und Verwaltung sich für die Softwareentwicklung komfortabel automatisieren lässt.

In Pocket speichern vorlesen Druckansicht 9 Kommentare lesen
Rust: Crates und Continuous Integration – eine perfekte Mischung

(Bild: lucadp / Shutterstock.com)

Lesezeit: 10 Min.
Von
  • Dr. Jens Breitbart
  • Dr. Stefan Lankes
Inhaltsverzeichnis

In größeren Softwareentwicklungsprojekten ist häufig frühzeitig ein Punkt erreicht, an dem Entwickler Probleme bekommen, den Überblick über alle Details der Software zu behalten. Um diese Hürde zu überwinden, lässt sich Code mit ähnlichen Funktionen gruppieren und von dem mit unabhängiger Funktionalität trennen. Ziel dieses Vorgehens ist es, Codeabschnitte, die einer bestimmten Funktion zugeordnet sind, schneller finden zu können, falls diese beispielsweise erweitert werden soll. Die Programmiersprache Rust bietet verschiedene Möglichkeiten für eine solche Gruppierung – die gröbste darunter sind die sogenannten Crates.

Mehr zur Rust

Rust verpackt jede Software beim Ausliefern in ein Crate (Kiste oder Schachtel). Dabei handelt es sich um eine Menge von Dateien, die zusammen kompiliert wurden und sich von anderen Komponenten importieren lassen. Das Erstellen und Verwenden solcher Kisten ist eng mit dem Paketmanager Cargo verwoben. Er verlangt für jedes Crate eine genaue Spezifikation, die in der Datei Cargo.toml bereitzuhalten ist. Ein erstes Gerüst lässt sich direkt mit Cargo erzeugen. Zum Beispiel wird durch cargo new --bin hello das Gerüst für das klassische Einstiegsprogramm Hello World erzeugt, das sich anschließend im Verzeichnis hello befindet. Die dabei erzeugte Datei Cargo.toml spezifiziert das Projekt. Für das Hello-World-Beispiel sieht die Datei wie folgt aus:

[package]
name = "hello"
version = "0.1.0"
authors = ["Heise <contact@heise.de>"]
edition = "2018"

# See more keys and their definitions at
# https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Neben Information zu den Autoren und der Version des Programms enthält die Datei eine Liste von Abhängigkeiten. Sie bleibt im vorliegenden Beispiel leer, da außer der Standard-Laufzeitumgebung von Rust keine weiteren Crates verwendet werden. Im Vergleich zu anderen Programmiersprachen ist die Rust-Laufzeitumgebung klein und beschränkt sich auf weniger Funktionen. Zum Erzeugen von Zufallszahlen beispielsweise müssen Entwickler bereits auf das Crate rand zurückgreifen. Für diesen Fall ist die Konfigurationsdatei daher folgendermaßen zu erweitern:

[dependencies]
rand = "0.7.3"

Cargo lädt dann automatisch rand in der Version 0.7.3 herunter, kompiliert und verbindet zum Beispielprogramm. Der benötigte Sourcecode und alle Abhängigkeiten sind auf crates.io hinterlegt, das als eine Art Datenbank für Crates dient. Anstelle einer Versionsnummer lassen sich auch Pfade zu lokalen Verzeichnissen oder Git-Repositorys hinterlegen. Zum Veröffentlichen eigener Crates steht crates.io prinzipiell jedem offen, solange auch alle Abhängigkeiten dort angegeben sind, damit gewährleistet ist, dass der Paketmanager alle Abhängigkeiten auflösen kann.

Voraussetzung für das Login auf crates.io ist bisher allerdings noch ein GitHub-Account. Nach dem Einloggen lässt sich über die Website ein API Token erzeugen, über den sich Cargo auf crates.io anmeldet, um beispielsweise ein neues Crate zu veröffentlichen:

$ cargo login 26BEISPIEL36API7TOKEN7364
$ cargo publish

Cargo überprüft, ob alle zur Veröffentlichung benötigten Information wie die Lizenz oder die Autoren vorliegen. Anschließend testet der Paketmanager den Code auf seine Kompilierbarkeit. Weiterführende Informationen dazu finden sich in der Rust-Dokumentation.