Eine echte pom.xml, requirements.txt, package.json oder go.mod in einer Programmieraufgabe nutzen

Wer mit einer echten requirements.txt, pom.xml oder package.json lernt, lernt das, was ihm in jedem Beruf und jedem Open-Source-Projekt begegnen wird. Deshalb deklariert eine Programmieraufgabe hier ihre Pakete genau so: in der Datei, die die Werkzeuge der Sprache lesen, ganz oben im Dateibaum der Aufgabe, und sonst ist nichts auszufüllen.

Dieselbe Datei funktioniert auf dem eigenen Rechner der Lernenden. Ein Projekt, das aus der Plattform herauskopiert oder aus Git hineingeladen wird, läuft also weiter, ohne dass jemand seine Pakete in ein Format von uns umschreiben muss.

Welche Datei für welche Sprache

Python liest requirements.txt oder pyproject.toml, und ein Notebook liest requirements.txt. Java liest pom.xml. Go liest go.mod. JavaScript und TypeScript auf Node lesen package.json. Die Datei liegt ganz oben im Baum und ist mit „Pakete“ gekennzeichnet, und eine neue Aufgabe öffnet sich mit einem kleinen durchgespielten Beispiel darin, das Sie ersetzen.

Bash, SQL, C, C++, C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin und Prolog haben keine Paketdatei: Bei ihnen haben die Ausführungen kein Netzwerk, das ein Paketmanager erreichen könnte, und was sie brauchen, ist bereits installiert.

  1. Die Aufgabe in ihrem Editor öffnen. Die Paketdatei liegt ganz oben im Dateibaum, gekennzeichnet mit „Pakete“.
  2. Die Pakete benennen. Schreiben Sie sie so, wie Sie es auf Ihrem eigenen Rechner tun würden, jeweils mit der genauen Version. Ein Versionsbereich wie >=2.0 oder ^4.18 wird abgelehnt, denn eine Version, die sich zwischen Ausführungen ändert, lässt sich nicht bewerten.
  3. Oder die vorhandene Datei übernehmen. Laden Sie sie ganz oben im Baum hoch oder legen Sie dort eine Datei mit diesem Namen an, und sie wird zur Paketliste der Aufgabe.
  4. Auf „Ausführen“ klicken. Die Pakete werden installiert, bevor das Programm startet. Die erste Ausführung dauert länger; spätere nutzen das bereits Geladene erneut.

Wie die Pakete installiert werden

Pakete werden in einem getrennten Container geladen und der Ausführung schreibgeschützt übergeben, und die Ausführung selbst hat kein Netzwerk. Ein Programm der Lernenden kann daher während der Ausführung nichts herunterladen, und eine Aufgabe, die dieselben Pakete wie eine andere deklariert, nutzt erneut, was schon geladen wurde.

Die Pakete jeder Sprache stammen aus einer freigegebenen Liste weit verbreiteter Pakete, zugeordnet so, wie das jeweilige Ökosystem Dinge benennt: Python- und npm-Pakete nach Namen, Java nach der Gruppe des Herausgebers und Go nach Modulpfad. Ein Paket, das nicht darauf steht, wird abgelehnt, bevor etwas läuft, und die Meldung nennt es. Wenn Ihr Kurs eines braucht, das fehlt, fragen Sie über den Support nach.

Eine Paketdatei darf bis zu 64 KB groß sein, wie jede andere Datei der Aufgabe. Lock-Dateien wie package-lock.json oder poetry.lock werden nicht gelesen: Installiert werden die genauen Versionen aus der Paketdatei.

Java und Maven

Eine pom.xml wird so gelesen, wie Maven sie für ihre Abhängigkeiten liest: Properties, Dependency Management, eine übergeordnete pom und BOM-Importe sowie Scopes, wobei ein Paket mit Test-Scope wie JUnit nur für die Tests da ist. Die Pakete kommen von Maven Central. Eine Gradle-Build-Datei wird nicht gelesen; verwenden Sie eine pom.xml.

Eine Java-Aufgabe, die erstellt wurde, bevor pom.xml unterstützt wurde, behält ihre ältere dependencies.xml, die weiterhin funktioniert. Um sie auf eine pom umzustellen, fügen Sie eine vollständige pom.xml hinein oder benennen Sie sie in pom.xml um.

Python, Node und Go

Eine Python-Aufgabe hat jeweils nur eine Paketdatei. Um von requirements.txt auf pyproject.toml umzustellen, benennen Sie die Datei um. Eine pyproject.toml wird auf ihre [project]-Abhängigkeiten oder die Dependencies-Tabelle von Poetry hin gelesen.

Eine package.json wird auf ihre dependencies hin gelesen, und beim Ausführen der Tests auch auf ihre devDependencies, wo ein JavaScript-Projekt ablegt, was nur seine Tests importieren. Install-Skripte werden nie ausgeführt.

Eine go.mod wird auf ihre Anforderungen hin gelesen, und auf ein replace, das ein Modul auf einen Ordner des Projekts selbst verweist, sodass eine Aufgabe ein Go-Modul mit eigenen Paketen sein kann.

Wer die Liste ändern darf

Lernende sehen die Paketdatei immer, denn sie zu lesen gehört dazu, das Projekt zu verstehen. Ob sie sie ändern dürfen, ist eine Einstellung der Aufgabe: Ist es erlaubt, fügen Lernende ihrer eigenen Kopie ein Paket hinzu, wie sie es auf dem eigenen Rechner täten, und die nächste Ausführung installiert es.

Häufige Fragen

Können Lernende selbst Pakete installieren?
Bei jeder Aufgabe mit Paketdatei, wenn die Aufgabe ihnen erlaubt, sie zu ändern. Sie tragen das Paket in die Datei ein, wie sie es auf dem eigenen Rechner täten, und die nächste Ausführung installiert es.
Kann ein Programm während der Ausführung Pakete herunterladen?
Nein. Die Ausführung hat kein Netzwerk; Pakete werden vorher in einem getrennten Container aus der freigegebenen Liste geladen.
Wird Gradle unterstützt?
Nein. Java-Aufgaben lesen eine pom.xml.
Warum muss jede Version exakt sein?
Damit alle Lernenden der Klasse und die Bewertung mit denselben Paketen laufen. Ein Versionsbereich würde installieren, was an dem Tag gerade am neuesten ist.