Kolumne

Continuous Integration mit Angular: Was bringt der neue Befehl npm ci?
Keine Kommentare

In dieser Folge der Kolumne „Webentwicklung mit Angular“ nimmt Karsten Sitterberg den neuen Befehl npm ci unter die Lupe. Welche Vorteile bietet npm ci, und wo liegt der Unterschied zu npm i?

Stabile Angular Builds mit npm ci

Buildserver zum automatisierten Bauen und Testen einer Anwendung sind mittlerweile zu einer akzeptierten Best Practice geworden. Für schnelles Feedback ist es wichtig, dass diese Builds regelmäßig und am besten unmittelbar nach jedem Commit erfolgen und der Build so zügig, wie möglich abläuft.

Bei Angular-Anwendungen werden Abhängigkeiten, wie zum Beispiel das Angular Framework selber, typischerweise durch NPM bereitgestellt. Bei jedem Build werden dann die benötigten Abhängigkeiten durch NPM ermittelt und geladen.

Mit der neuen Art, Abhängigkeiten per NPM zu installieren, wird die Abhängigkeitsverwaltung schneller und sicherer.

Seit NPM 5 gibt es die package-lock.json-Datei, in der die ermittelten Versionen aller momentan in dem Projekt befindlichen Abhängigkeiten und Sub-Abhängigkeiten aufgelistet sind. Dies wurde eingeführt, um zu verhindern, dass bei jeder separaten Installation von Abhängigkeiten eine unterschiedliche Zusammensetzung von Paketversionen verwendet wird. Dies war in der Vergangenheit häufig der Grund für “Works-on-my-machine”-Fehler, die nicht nur in der CI-Umgebung aufgetreten sind. Auch nach der Einführung der package-lock.json konnte es noch zu Fehlern bei inkrementell installierten Abhängigkeiten oder unterschiedlichen npm-Versionen kommen. Zudem dauert ein Installationsvorgang mit npm install recht lange, da jedesmal die package-lock.json verifiziert und im Zweifel Abhängigkeiten neu aufgelöst werden müssen.

Kostenlos: Das iJS React Cheat Sheet

Sie wollen mit React durchstarten?
Unser Cheatsheet zeigt Ihnen alle wichtigen Snippets auf einen Blick.
Jetzt kostenlos herunterladen!

Download for free

 

API Summit 2018

From Bad to Good – OpenID Connect/OAuth

mit Daniel Wagner (VERBUND) und Anton Kalcik (business.software.engineering)

npm ci

Bei all diesen Situationen bietet der neue Befehl npm ci Abhilfe. Durch Verwendung dieses Befehls wird zunächst der komplette node_modules-Ordner eines Projektes gelöscht, um eine saubere installation zu gewährleisten. Dann werden alle Abhängigkeiten genauso installiert, wie sie in der package-lock.json angegeben sind, ohne dass sie neu aufgelöst werden. Dies macht den Installationsprozess dann auch besonders schnell.

Falls die Version einer Abhängigkeit in der package-lock.json nicht zu der entsprechenden Angabe in der package.json passt – etwa weil die package.json manuell angepasst wurde – so wirft npm ci einen Fehler. Ebenso wird ein Fehler geworfen, wenn keine package-lock.json vorhanden ist. Um die package-lock.json zu generieren oder zu aktualisieren, muss weiterhin der Befehl npm install verwendet werden, was eine typische Entwickleraufgabe darstellt.

Um die bessere Build-Reproduzierbarkeit und höhere Geschwindigkeit der Builds mit npm ci nutzen zu können, sollte man als Entwickler zunächst einmal die package-lock.json per npm install erzeugen und im Verlauf des Projektes pflegen. Dazu ist es ebenfalls erforderlich, die package-lock.json per Version-Control mit einzuchecken. So kann die package-lock.json dann auch in der CI-Umgebung dazu genutzt werden, reproduzierbare Builds zu erzeugen.

Um die Installationszeiten der beiden Befehle zu vergleichen, erzeugen wir ein Beispielprojekt mit Angular CLI, welches auch die @ngrx-Library als Abhängigkeit definiert:

ng new test-ci
cd test-ci
npm i @ngrx/{store,effects,entity,store-devtools}

Nachdem die package-lock.json generiert wurde, werden die node_modules für die beiden Tests jeweils gelöscht:

rm -rf node_modules

Dann wird für beide Befehle die benötigte Zeit gemessen. Dabei schnitt das Installieren mit npm ci in der Stichprobe besser ab, ein Probelauf ergab beispielsweise etwa 14 Sekunden Laufzeit für npm i und nur gut 9 Sekunden für npm ci.

Fazit

Mit der neuen Art, Abhängigkeiten per NPM zu installieren, wird die Abhängigkeitsverwaltung und damit die Builds in CI-Umgebungen zum einen schneller, zum anderen sicherer. Allerdings profitieren nicht nur CI-Umgebungen, auch in einer normalen Entwicklungsumgebung sollte sich schnelles und zuverlässiges Installieren von Abhängigkeiten positiv auf die Entwicklerproduktivität auswirken.

 

In der Kolumne „Webentwicklung mit Angular“ gibt Karsten Sitterberg Tipps für die Entwicklung von SPAs mit dem populären JavaScript-Framework von Google.

Unsere Redaktion empfiehlt:

Relevante Beiträge

X
- Gib Deinen Standort ein -
- or -