Skip to main content

Yarn

Was ist Yarn?

Yarn ist ein neuer JavaScript-Paketmanager, der von Facebook, Google, Exponent und Tilde erstellt wird.

In der JavaScript-Community teilen Ingenieure Hunderttausende von Code-Teilen, sodass das Umschreiben von Basiskomponenten, Bibliotheken oder Frameworks vermieden werden kann. Jeder Code kann wiederum von anderen Codes abhängen und diese Abhängigkeiten werden von Paketmanagern verwaltet. Der zuvor beliebteste JavaScript-Paketmanager ist der npm-Client, der Zugriff auf mehr als 300.000 Pakete in der npm-Registrierung bietet.

Der npm-Client wurde seit Jahren erfolgreich bei Facebook eingesetzt, aber als die Größe des Codebase und die Anzahl der Ingenieure wuchsen, gab es Probleme mit der Konsistenz, Sicherheit und Leistung. Nach dem Versuch für jedes Problem eine Lösung zu finden, um die Abhängigkeiten zuverlässiger verwalten zu können, entwickelten die Ingenieure Yarn – ein schneller, zuverlässiger und sicherer alternativer npm-Client.

Mit Yarn haben Ingenieure immer noch Zugriff auf die npm-Registrierung, können jedoch Pakete schneller installieren und Abhängigkeiten konsistent auf Computern oder in sicheren Offline-Umgebungen verwalten. Mithilfe von Yarn können sie zudem kurzerhand und zuverlässiger vorgehen, wenn sie gemeinsam genutzten Code verwenden, um sich auf das Wesentliche zu konzentrieren: die Entwicklung neuer Produkte und Funktionen.

Entwicklung des JavaScript-Paketmanagements bei Facebook

In den Tagen vor den Paketmanagern war es für JavaScript-Ingenieure üblich, sich auf eine kleine Anzahl von Abhängigkeiten zu verlassen, die direkt in ihren Projekten gespeichert waren oder von einem CDN (Content Delivery Network) bedient wurden. Der erste große JavaScript-Paketmanager npm wurde kurz nach der Einführung von Node.js erstellt und entwickelte sich schnell zu einem der beliebtesten Paketmanager der Welt. Tausende neuer Open-Source-Projekte wurden erstellt und die Ingenieure teilten mehr Code als je zuvor.

Viele der Projekte bei Facebook, wie zum Beispiel React, hängen vom Code in der npm-Registrierung ab. Bei der internen Skalierung gab es jedoch Probleme mit der Konsistenz bei der Installation von Abhängigkeiten zwischen verschiedenen Computern und Benutzern. Eine weitere Problematik sah man in der Zeit, die für das Abrufen von Abhängigkeiten erforderlich war sowie einige Sicherheitsbedenken hinsichtlich der Art und Weise, wie der npm-Client den Code aus diesen Abhängigkeiten automatisch ausführte.

Yarn als neuer Paket-Manager

Yarn ist ein neuer Paket-Manager, der den vorhandenen Workflow für den npm-Client oder andere Paketmanager ersetzt und dabei mit der npm-Registrierung kompatibel ist. Es verfügt über die gleichen Funktionen wie bestehende Workflows und arbeitet schneller, sicherer und zuverlässiger. Die Hauptfunktion eines Paketmanagers ist die Installation eines Pakets – eines Codes, der einem bestimmten Zweck dient – von einer globalen Registrierung in die lokale Umgebung eines Ingenieurs. Jedes Paket kann von anderen Paketen abhängen oder nicht. Ein typisches Projekt kann Dutzende, Hunderte und sogar Tausende von Paketen in seinem Abhängigkeitsbaum enthalten.

Diese Abhängigkeiten werden versioniert und basierend auf semantischer Versionierung (Semver) installiert. Semver definiert ein Versionsschema, das die Arten von Änderungen in jeder neuen Version widerspiegelt, unabhängig davon, ob eine Änderung eine API unterbricht, eine neue Funktion hinzufügt oder einen Fehler behebt. Semver ist jedoch darauf angewiesen, dass Paketentwickler keine Fehler begehen. Brechende Änderungen oder neue Fehler können zu installierten Abhängigkeiten führen, wenn die Abhängigkeiten nicht gesperrt sind.

Architektur

Im Node-Ökosystem werden Abhängigkeiten in einem Node-Module-Verzeichnis in einem Projekt platziert. Diese Dateistruktur kann jedoch vom tatsächlichen Abhängigkeitsbaum abweichen, da doppelte Abhängigkeiten zusammengeführt werden. Der npm-Client installiert Abhängigkeiten im Verzeichnis Node-Module nicht deterministisch. Dies bedeutet, dass die Struktur eines Node-Module-Verzeichnisses aufgrund der installierten Reihenfolge der Abhängigkeiten von Person zu Person unterschiedlich sein kann. Diese Unterschiede können dazu führen, dass auf einem Computer funktionierende Fehler auftreten, die viel Zeit in Anspruch nehmen.

Yarn behebt diese Probleme im Zusammenhang mit Versionierung und Nicht-Determinismus, indem Sperrdateien und ein Installationsalgorithmus verwendet werden, der deterministisch und zuverlässig ist. Diese Lockfiles sperren die installierten Abhängigkeiten auf eine bestimmte Version und stellen sicher, dass bei jeder Installation auf allen Computern dieselbe Dateistruktur in Node-Module entsteht. Die geschriebene Sperrdatei verwendet ein kurzes Format mit geordneten Schlüsseln, um sicherzustellen, dass die Änderungen minimal sind und die Überprüfung einfach ist.

Der Installationsvorgang ist in drei Schritte unterteilt:

1. Schritt
Yarn fängt an, Abhängigkeiten aufzulösen, indem er Anforderungen an die Registrierung stellt und jede Abhängigkeit rekursiv nachschlägt.

2. Schritt
Als Nächstes sucht Yarn in einem globalen Cache-Verzeichnis, ob das benötigte Paket bereits heruntergeladen wurde. Wenn dies nicht der Fall ist, ruft er das Tarball für das Paket ab und platziert es im globalen Cache, sodass es offline arbeiten kann und Abhängigkeiten nicht mehr als einmal heruntergeladen werden müssen. Abhängigkeiten können auch in der Quellcode-Verwaltung als Tarballs für vollständige Offline-Installationen platziert werden.

3. Schritt
Schließlich verknüpft Yarn alles miteinander, indem alle benötigten Dateien aus dem globalen Cache in das lokale Verzeichnis Node-Module kopiert werden.

Durch die saubere Trennung dieser Schritte und die Verwendung deterministischer Ergebnisse kann Yarn Operationen parallelisieren, wodurch die Ressourcennutzung maximiert und der Installationsprozess beschleunigt wird. Bei einigen Facebook-Projekten reduzierte Yarn den Installationsvorgang um eine Größenordnung von einigen Minuten auf wenige Sekunden. Er verwendet auch einen Mutex, um sicherzustellen, dass mehrere ausgeführte CLI-Instanzen nicht miteinander kollidieren und sich gegenseitig verschmutzen.

Während des gesamten Prozesses gibt Yarn strikte Garantien für die Paketinstallation. Der Nutzer hat die Kontrolle darüber, welche LifeCycle-Scrips für welche Pakete ausgeführt werden. Paketprüfsummen werden ebenfalls in der Sperrdatei gespeichert, um sicherzustellen, dass man jedes Mal dasselbe Paket erhält.

Features

Zusätzlich zu einer schnelleren und zuverlässigeren Installation gibt es zusätzliche Funktionen, um den Workflow des Abhängigkeits-Managements weiter zu vereinfachen:

  • Kompatibilität mit den npm- und Bower-Workflows und Unterstützung beim Mischen von Registern
  • Möglichkeit, Lizenzen von installierten Modulen einzuschränken und die Ausgabe von Lizenzinformationen zu ermöglichen
  • Bereitstellung einer stabilen öffentlichen JS-API, bei der die Protokollierung für die Verwendung über Build-Tools abstrahiert wird.

Sie haben noch Fragen?

Kontaktieren Sie uns

Kostenloser SEO-Check der OSG