Ein Tweet von Ilker hat mich heute schwer getroffen. Er schieb:
If you really want a stable build system, then you should stop using nuget (or any other pm) in your builds.
— Ilker Cetinkaya (@ilkerde) January 3, 2014
Recht hat er damit, das war mir schon lange davor klar. So habe ich es mir sehr schnell angewöhnt, Abhängigkeiten mit ins Repository zu packen. Dies bringt den Vorteil mit sich, dass nach einem Pull alles Notwendige vorhanden ist, und sofort durchgestartet werden kann. Was für die Entwicklung gilt, gilt auch für das Build-System. Lokales Repository aktualisieren, alles da. Oftmals müssen nach einem Pull erst Abhängigkeiten aktualisiert oder gar erst herunter geladen werden. Geht dies schief, geht auch der Build schief. Keine Situation die man haben möchte. Ein weiterer Vorteil besteht darin, dass mit jeder Revision gearbeitet werden kann, da die Abhängigkeiten in den passenden Versionen dazu vorhanden sind. Ein Nachladen ist oftmals nicht möglich, da die notwendige Version online eventuell nicht mehr zur Verfügung steht.
Getroffen hat mich der Tweet, als mir dann meine Node.js Projekte eingefallen sind, die ich so auf GitHub hoste. Diese enthalten alle nur die package.json mit der Definition der Abhängigkeiten. Das Verzeichnis node_modules wurde nicht ins Repository eingebunden. Aus einem mir nicht begreiflichen Grund habe ich mein Verhalten bei Node.js Projekten geändert. Als ob diese anders zu behandeln wären.
Aus Interesse habe ich mich dann durch zahlreiche einschlägige Repositories auf GitHub geklickt. Kaum jemand legt Abhängigkeiten im Repository ab. Warum kann ich mir nicht erklären. Vermutlich schauen sich jedoch viele den Aufbau von bestehenden Repositories ab und werden dies somit auch nicht tun. Zudem ist eine Installation mit NPM (durch ein etwaiges Build-System oder einem Entwickler) somit Pflicht. Und genau das sollte es nicht sein.
Lege Abhängigkeiten immer im Repository ab. Damit enthält jede Revision alles Notwendige um lauffähig zu sein. Weder das Build-System noch andere Entwickler müssen sich um das Installieren oder Aktualisieren von Abhängigkeiten kümmern. Alles und jeder kann sofort Produktiv sein.
Think about it.