NPM, warum wird nicht Version x angezogen?

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.054
Hi :)

Ich bin jedesmal aufs Neue verwirrt wenn ich mir den Versionswirrwar ansehen muss in den node_modules und package.json.

Es geht um die dependency json5, dazu habe ich mal im Projekt 'npm list json' ausgeführt:
1672757087564.png


Im package.json unter folgendem Pfad resolve-url-loader/node_modules/loader-utils steht nun folgendes:
Javascript:
"dependencies": {
    "json5": "^2.1.2"
 }

Sprich das müsste ja die Version 2.2.3 von json5 miteinschliessen. Aber warum wird die nicht angezogen?

Ich finde im ganzen Projekt nur Versionsangaben mit ^x.y.z
 
Hier die Erklärung zur Versions-Syntax: https://docs.npmjs.com/about-semantic-versioning

In deinem Beispiel ziehst du bis zum Minor-Release 2.1.2.

Ob eine höhere Version in deinem Paket funktioniert, hängt halt davon ab wie du die Abhängigkeit verwendest.

Wenn du bspw. eine Methode nutzt, die in einer höheren Version entweder nicht mehr vorhanden ist oder eine andere Schnittstelle nutzt, dann kannst du sie nur verwenden wenn du dein Coding anpasst.

Hier kannst du das auch mal ausprobieren und findest am Ende der Seite auch noch weitere Beispiele für die Syntax:

https://semver.npmjs.com/
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: tollertyp
Was semver bedeutet ist mir klar, auch kenne ich die https://semver.npmjs.com/ Seite.

^ bedeutet imho das man alle Version bis zum nächsten Major-Release einschliesst. Sprich ^2.1.2 schliest 2.x.x mit ein, aber nicht mehr 3.x.x

Also warum wird jetzt nicht einfach die neueste Version von json5 angezogen?
'mindestens' stimmt teilweise, aber imho sollte da auch automatisch auf eine neuere Version gewechselt werden wenn verfügbar? Oder geschieht dies nur wenn man sie explizit definieren würde?
 
Nutzt du
Code:
npm install
in einem Ordner in dem schon node_modules existiert?

Wenn ja probiere mal:
Code:
npm update

Das sollte die Abhängigkeiten updaten.
 
Ja und nein. Wenn du nach Erstellung des Projekts das erste Mal die Packete ziehst, nimmt NPM die zu dem Zeitpunkt aktuellste, passende Version und aus den jeweilg gezogenen Versionen wird dann eine package-lock.json erstellt, wo die konreten Versionen drin stehen, die runtergeladen wurden. Ist bei einem npm install diese package-lock Datei vorhanden, zieht NPM eben die konkreten, dort eingetragenen Versionen. Sprich, eine vorhandene package-lock.json hat eine höhere Priorität als die Versionsangaben in der package.json.

Willst du nachträglich neuere, passende Versionen haben, musste du das mit explizit npm update machen. Das zieht dann die Abhängigkeiten entsprechend der Semver-Angaben auf neuerer Versionen hoch, sofern verfügbar und aktualisiert entsprechend die package-lock.json.

Nachtrag: Und um der Frage vorzugreifen, wozu dieses zweigleisige Verhalten. Dafür gibt es einen einfachen Grund: Reproduzierbarkeit/Konsistenz. Durch das "Anpinnen" der Versionen stellt man sicher, das alle Mitarbeiter am Projekt mit identischen Versionen der Abhängigkeiten arbeiten. Nur der Projektleiter (oder ähnlicher Posten) erstellt initial die package-lock.json und zieht bei Bedarf die Versionen mit npm update noch.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hendoul und blablub1212
Ok, das explizite definieren von
"json5": "2.2.3"

in meinem eigenen package.json hilft schon mal für alle definierten ^2.x.x Versionen.

@blablub
Ich entferne jeweils alles in den node_modules wenn ich was an den Versionen ändere:
rm -rf node_modules
und dann npm install

npm update würde auch funktionieren und die Version auf die 2.2.3 anheben, mit dutzenden von anderen libraries :D Muss mal schauen wie man nur spezifisch eine Library updaten kann.


@mibbio
Ah danke, das habe ich mal wieder völlig vergessen.
 
Hendoul schrieb:
Ich entferne jeweils alles in den node_modules wenn ich was an den Versionen ändere:
rm -rf node_modules
und dann npm install
Ist beim Ausführen von npm install keine package-lock.json vorhanden, nimmt er die Versionen/Versionsbereiche, wie sie in der package.json angegeben sind. Existiert aber bereits eine lock Datei, installiert er die konkret dort hinterlegten Versionen.

Ein npm update ignoriert quasi die lock Datei, richtet sich nach der package.json und generiert die lock Datei im Anschluss entsprechend neu.
 
  • Gefällt mir
Reaktionen: Hendoul
Was ich noch nicht verstehe ist warum eine 0.4.0 Version von json5 nicht auftaucht in der npm list

Die taucht nämlich hier auf, eine dependency von rechoir 0.6.2
1672763866153.png


Eine andere Dependency zieht rechoir@0.7.1 an und dort ist dann die json5 Dependency nicht mehr vorhanden.

Aber ich hätte jetzt gedacht, dass die json5@0.4.0 nun auch auftauchen müsste wenn ich "npm list json5" ausführe.

^0.4.0 erlaubt ja nicht die Benutzung von 2.x , müsste also deshalb nicht die 0.4.0 gezogen werden?
Im lockfile kann ich auch keine 0.4.0er Version finden.

Hat es evtl. damit zu tun, dass die json5@0.4.0 dependency als devDependency definiert ist in rechoir@0.6.2?


edit:
ja das sollte der Grund gewesen sein:
https://stackoverflow.com/questions/17374278/npm-install-not-pulling-in-devdependencies
 
Zurück
Oben