Drama um npm: NodeJS builds auf der ganzen Welt rot

Denke dass es hier nicht allzuviele mitbekommen haben:
JavaScript-Paket aus NPM entfernt: Node, Babel und Co. scheiterten beim Build | heise online

Bei mir in der Firma ging es drunter und drueber am Donnerstag, da wir NodeJS mit npm als Packetmanager einsetzen.

Was war passiert?
Ein Entwickler hat seine 272 module von npm loeschen lassen, darunter war eines das von recht wichtigen Projekten verwendet wurde, hier der Code:


function leftpad (str, len, ch) {
  str = String(str);

  var i = -1;

  if (!ch && ch !== 0) ch = ' ';

  len = len - str.length;

  while (++i < len) {
    str = ch + str;
  }

  return str;
}```
https://github.com/azer/left-pad/blob/master/index.js

Ja, ganz genau, die paar furzigen Zeilen Code - ober besser deren Abwesehnheit - "haben das Internet kaputt gemacht"..
Hier 'ne Google Suche fuer die die es nicht glauben koennen: https://www.google.com.au/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=kik%20npm%20broke%20the%20internet

Tja das ist der Blödsinn, wenn man eine solche Funktion nicht in der Standard Library hat.

Naja, alles in die Standardlibrary zu packen kann ja nicht der Sinn sein, ich würde so etwas nicht in der Sprache selbst erwarten - sonst sind wir irgendwann bei PHP, wo so ziemlich alles in die Standard Library gepackt wird.

Das größere “WTF” für mich ist eigentlich, dass die Paketverwaltung es jemand erlaubt seine Pakete zurückzuziehen. Soweit ich weiß ist das im Maven Repository nicht so einfach, und ich entnehme dem Heise Artikel, dass es nicht einmal eine stabile Versionierung in npm gibt? Ernste Frage, wie kann ich mir das vorstellen: Jeder wirft seine Pakete da rein, und wenn ich Glück habe weiß er was er tut und verursacht in meinen Abhängigkeiten keine Breaking Changes?

Andere Sprachen, wie Java und Python bieten verhältnismäßig einfache Konstrukte um ein leftpad anzufordern. Java: java - Generate fixed length Strings filled with whitespaces - Stack Overflow Python: ‘{:>15}’.format(‘Test’)

Btw. mein voriger Post war auch sarkastisch gemeint ;-). Ich weiß schwierig zu erkennen.

Hier ist ein Blog-Eintrag von npm selbst.

Das Schlimme daran ist, dass jeder ein „unpublished“ Modul übernehmen und mit beliebigem Code ersetzen kann.

The other 272 affected modules were adopted by others in the community in a similar time. They either re-published forks of the original modules or created “dummy” packages to prevent malicious publishing of modules under their names.

Ich bin auch irgendwie davon ausgegangen, dass npm(js) kein kommerzielles Unternehmen sei (sondern irgendeine OS Foundation). GitHub hatte ähnliche Probleme in der Vergangenheit.

Man kann niemals alles in der Standard API haben, waere einseits sehr unflexibel und andererseits wuerden sich ganz schnell Altlasten anhaeufen.

NodeJS und speziell npm sind recht Jung, wenn ich much zurueckerinnere wie das for 15 jahren in Java war… mit Apache Jakarta zB. hatte man ploetzlich einigermassen verlaessliche OSS Bibliotheken, auch konnte nicht ein einziger Entwickler so grosse Entscheidungen treffen.

Dass npm einfach mal so das entfernen von 272 packeten erlaubte macht mich sprachlos, dann hab ich erfahren dass es sich dabei um firma handelt, die sogar einen CTO hat… Wtf?
Durch solche Erkenntnisse weiss ich die Apache foundation und andererseits erst richtig zu schaetzen :slight_smile:
Auch Maven hatte Probleme, aber sowas nicht IMHO

Mal sehen wie das auf Dauer mit NodeJS und npm weitergeht, gibt schon etliche die es besser machen wollen, denke das ist die erste talkurve im hype cycle: Hype cycle - Wikipedia

Pakete aus einem offiziellen Repository entfernen ist ja noch eine Sache,
so wie auch eine Java-Version nicht mehr zur Verfügung gestellt werden könnte,
aber wie sah/ sieht es (in kurz geschrieben) mit den weiteren Auswirkungen aus?

hätten bestimmte Webserver oder Browser oder sonstige Programme wie ‘npm-Paketmanager’ nicht mit dem vorherigen Stand weiter funktionieren können?
gab es da zu forsche sofortige Updates auf nicht mehr funktionierende, not-stable, Versionen, wie konnte das passieren?

npm kennt keine sogenannten lock-Files, die die genau benutze Version spezifizieren und woher man diese bekommt, dass man wenigstens bei einen reinen Install nicht auf das nom-Repo angewießen ist.

[quote=SlaterB]Pakete aus einem offiziellen Repository entfernen ist ja noch eine Sache,
so wie auch eine Java-Version nicht mehr zur Verfügung gestellt werden könnte,[/quote]
Man bekommt die alten Java Versionen trotzdem noch, aber normalerweise macht man sein eigenes Repo (zB im Debian Repo format) auf um solche sachen automatisiert installieren zu koennen.

npm hat sein eigenes Format, man kann es spiegeln, aber was aus dem Original Repo entfernt wird fliegt auch vom Mirror. Koennte mann natuerlich aendern, aber das hat andere Implikationen, zB. das Entwickler etwas verwenden dass es so nicht mehr gibt.

Builds die auf das npm Repo angewiesen waren von konnten nicht mehr gebaut werden, 272 Packete fehlten, eines davon von recht wichtigen genutzt.

[quote=SlaterB;131638]hätten bestimmte Webserver oder Browser oder sonstige Programme wie ‚npm-Paketmanager‘ nicht mit dem vorherigen Stand weiter funktionieren können?
gab es da zu forsche sofortige Updates auf nicht mehr funktionierende, not-stable, Versionen, wie konnte das passieren?[/quote]
Bin mir nicht sicher wer diese 272 Packete entfernt hat, der Entwickler selber oder npm, haette aber niemals so passieren duerfen, geht bei maven repos theoretisch auch, ist aber aufwaendig, und wird sicherlich nicht fuer 272 Packete von jetzt auf gleich gemacht.

Von Babel gab es ein update ein paar Stunden spaeter was diese Abhaengigkeiten nicht mehr nutzte, ma musste die version updaten.

Ansonsten ist mir die NodeJS Community zu optimistisch was Semantic Versioning betrifft, Versionsranges sind da standard. Man weiss also nie genau welche Version der Abhaengigkeiten man bekommt :frowning: