Konkurrenz oder …: Yarn vs npm

the next big thing  –  0 Kommentare

Vor rund einem Monat wurde Yarn veröffentlicht, eine neue Paketverwaltung für JavaScript und Node.js. Wozu bedarf es einer weiteren Paketverwaltung neben npm? Tatsächlich gibt es einige Szenarien, in denen der Einsatz von Yarn durchaus empfehlenswert ist.

Am 11. Oktober 2016 hat Facebook Yarn veröffentlicht. Im Prinzip handelt es sich dabei um ein alternatives Kommandozeilenwerkzeug zu npm, das allerdings trotzdem auf die Registry von npm zugreift. Es handelt sich also lediglich um ein anderes Entwicklerwerkzeug, nicht um ein vollständig neues Ökosystem. Das wäre hinsichtlich des großen Erfolgs von npm auch nicht sonderlich sinnvoll.

Die Installation von Yarn erfolgt dabei sogar über npm, sodass man npm und Yarn potenziell parallel verwenden kann. Zum Installieren genügt der folgende Aufruf:

$ npm install -g yarn

Danach lässt sich Yarn ähnlich wie npm aufrufen. Ein Aufruf von

$ yarn install

liest die Datei package.json aus und installiert die darin referenzierten Module. Das Kommando entspricht daher dem Aufruf von npm install. Um ein neues Modul zu installieren und es der Datei package.json hinzuzufügen, dient das add-Kommando von Yarn. Um beispielsweise Express zu installieren, genügt der folgende Aufruf:

$ yarn add express

Das entspricht dem Aufruf von npm install unter Angabe eines Moduls mit dem zusätzlichen Parameter --save. Die eigentliche Installation erfolgt dabei in drei Schritten und ähnelt der von npm: Zunächst werden die Abhängigkeiten der angeforderten Module aus der Registry aufgelöst, anschließend fehlende Module in den Cache heruntergeladen und von dort schließlich in das lokale node_modules-Verzeichnis der Anwendung kopiert.

Das Vorgehen ähnelt dem, das npm seit der Version 3 einsetzt, und lässt sich leicht parallelisieren, was der Geschwindigkeit der Installation zugute kommt. Vor allem aber arbeitet Yarn auf dem Weg deterministisch, sodass das Ergebnis vorhersagbar ist. Das klingt zunächst ebenfalls nach npm, allerdings ist das Ergebnis dort keinesfalls deterministisch.

Regelmäßig kommt es nämlich vor, dass verschachtelte Abhängigkeiten keine strikten Versionsvorgaben machen, weshalb zeitlich versetzte Installationen auf Basis der gleichen package.json-Datei zu unterschiedlichen Ergebnissen kommen. Doch Yarn garantiert ein reproduzierbares Ergebnis. Wie funktioniert das?

Die Antwort liegt in einer neuen Datei namens yarn.lock, in der bei der ersten Installation eines Moduls die tatsächlich installierte Version notiert wird. Diese Datei gilt es, in die Versionsverwaltung einzuchecken, sodass weitere Installationsvorgänge auf die darin enthaltenen Informationen zurückgreifen können. Im Prinzip entspricht das Vorgehen also dem Kommando npm shrinkwrap, bei npm ist das jedoch optional, bei Yarn geht es nicht anders.

Natürlich gibt es dabei einiges zu beachten, unter anderem in Verbindung mit Docker, wenn dessen Caching effizient genutzt werden soll. Einen guten Überblick zu dem Thema liefert der Blogeintrag Using Yarn with Docker von Martino Fornasa.

Ein besonderes Merkmal von Yarn ist die Tatsache, die Installation von Modulen in Abhängigkeit der von diesen verwendeten Lizenzen zuzulassen oder abzulehnen. Damit lässt sich sicherstellen, dass ausschließlich Module verwendet werden, die zur eigenen Lizenz kompatibel sind oder der persönlichen Überzeugung entsprechen.

Das Unternehmen npm hat die Veröffentlichung von Yarn begrüßt, denn das sei die Art, wie Open Source funktioniere: Vielfalt fördere das Geschäft. Außerdem besteht die Option, dass auch das Kommandozeilenwerkzeug von npm von Erkenntnissen des Yarn-Teams profitieren könne. Genau solche Win-Win-Situationen sind das, was die Open-Source-Szene auszeichnet und stark macht.

Wer sich für die Unterschiede zwischen npm und Yarn im Detail interessiert, dem sei der Artikel Yarn vs npm: Everything You Need to Know von Tim Severien empfohlen.

tl;dr: Yarn ist eine Alternative zu npm, wobei beide Kommandozeilenwerkzeuge die gleiche Registry verwenden. Die Vorteile von Yarn liegen in der Reproduzierbarkeit von Installationen, der Geschwindigkeit und der eingebauten Unterstützung für Lizenzprüfungen.