Transitive Abhängigkeiten mit npm in den Griff bekommen

Freitag, 30.6.2023

Titelbild_npm

Wer Webanwendungen baut, kommt oft mit Node.js und dem dazugehörigen Paketmanager npm in Berührung. Mit letzterem können die von der Webanwendung benötigten Abhängigkeiten verwaltet werden. Bisher war es jedoch lediglich möglich direkte Abhängigkeiten zu verwalten. Transiente Abhängigkeiten – also Abhängigkeiten der Abhängigkeiten – entzogen sich der Kontrolle der Entwickler:innen. Bei einer Sicherheitslücke in einer transienten Abhängigkeit musste daher bisher immer erst der Maintainer der direkten Abhängigkeit die Version der betroffenen Abhängigkeit aktualisieren und eine neue Version seiner Bibliothek zur Verfügung stellen. Mit npm 8.3 hat sich dies nun geändert.

Zur Lösung dieses Problems wurden von npm die overrides eingeführt. Mit ihnen können nun auch transitive Abhängigkeiten überschrieben werden. Zur Vereinfachung des folgenden Beispiels wird davon ausgegangen, dass alle Pakete feste Versionsnummern definieren und keine Versionsranges.

Ein Projekt hat in seiner package.json die Bibliothek foo als Abhängigkeit definiert. Wenn es von foo eine neue Version gibt, etwa weil eine Sicherheitslücke gepatcht wurde, so kann diese neue Version in der package.json eingetragen werden. Wenn jetzt aber die Bibliothek foo eine Abhängigkeit bar verwendet und in bar wird eine Sicherheitslücke gefunden, so waren Nutzer:innen von foo bisher auf eine neue Versionen von bar und von foo (die die neue Version von bar referenziert) angewiesen.

Ab npm 8.3 können nun auch Versionen von transitiven Abhängigkeiten in einer package.json überschrieben werden.

Unter dem Eintrag overrides in der package.json kann die zu nutzende Version einer Abhängigkeit definiert werden:  

Mit diesem Eintrag werden alle Vorkommnisse von bar, egal in welcher Abhängigkeit auf Version 1.0.1 überschrieben.

Dieses Vorgehen ist jedoch meist nicht gewünscht, denn gerade kleine Hilfsbibliotheken werden im Baum der Abhängigkeiten oft in unterschiedlichen Versionen verwendet.

 

Exkurs: Vorkommen von Paketen auflisten

Mit  npm ls <Paketname>  können alle Vorkommen eines Pakets aufgelistet werden. Im folgenden Beispiel wird mit npm ls @angular/core jedes Vorkommen von @angular/core aufgelistet:

npm

 

 

Um nur Vorkommen von bar zu ersetzen, die im Abhängigkeitsbaum nach foo kommen, kann folgende Notation genutzt werden:

 

Zu beachten ist, dass in diesem Fall alle Vorkommen von bar ersetzt werden, die nach foo kommen, ganz egal in welcher Tiefe, d. h. wenn eine Abhängigkeit von foo irgendwo wieder eine Abhängigkeit auf bar hat, so wird für diese auch die Versionsnummer überschrieben.

Wenn dies nicht gewünscht ist, kann man den Abhängigkeitspfad, welcher unter overrides angegeben ist, beliebig tief weiter spezifizieren.

Darüber hinaus kann man das Überschreibeverhalten mit einer Versionsnummer oder einem Versionrange genauer spezifizieren. Hierfür wird an den Paketnamen ein @ und die Versionsnummer oder Versionrange angehangen:

Wenn foo in der Version 2.0.0 vorliegt, ersetze dessen Abhängigkeiten auf bar durch Version 1.0.1 von bar.

Weitere Informationen zu npm overrides finden sich auch in der offiziellen npm Dokumentation.

 

 

 

 

 


zurück zur Blogübersicht

Diese Beiträge könnten Sie ebenfalls interessieren

Keinen Beitrag verpassen – viadee Blog abonnieren

Jetzt Blog abonnieren!

Kommentare

Christian Siebmanns

Christian Siebmanns

Christian Siebmanns ist Berater bei der viadee IT-Unternehmensberatung. Schwerpunkt seiner Arbeit ist der Einsatz in verschiedenen Kundenprojekten im Webumfeld. Christian ist Experte für Java und TypeScript.