Teilen leichtgemacht: Eigene Module für Node.js veröffentlichen

Jeder Node.js-Entwickler verwendet regelmäßig Module aus der Community. Warum nicht einmal den Spieß umdrehen und der Gemeinschaft ebenfalls eine Komponente zur Verfügung stellen? Mit der Paketverwaltung npm gelingt dies in wenigen einfachen Schritten.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 6 Min.
Von
  • Golo Roden
Inhaltsverzeichnis

Im Vergleich zu vielen anderen Plattformen verfügt Node.js über eine außergewöhnlich dynamische Community. Dies liegt nicht zuletzt an der Paketverwaltung npm, wie unter anderem Gregg Caines in seinem äußerst lesenswerten Blogeintrag "The node.js Community is Quietly Changing the Face of Open Source" beschrieben hat.

Eine seiner zentralen Aussagen lautet, dass der für den Kern von Node.js angestrebte Minimalismus die Entwicklung von Modulen auf die gleiche Art fördert, wie die Einschränkung eines Tweets auf 140 Zeichens dazu anspornt, häufiger zu schreiben:

"Just like the 140 character limit on twitter makes people "blog" more, the node.js community has a culture of publishing tiny modules that makes people more comfortable with publishing smaller packages, and so it happens vastly more often."

Die Frage ist nur: Wie veröffentlicht man ein Modul?

Es liegt nahe, dass man ein Modul zunächst entwickeln muss, bevor man es veröffentlichen kann. Ein Modul unterscheidet sich dabei prinzipiell nicht von einer vollständigen Anwendung, erfordert aber zwingend eine korrekt konfigurierte package.json-Datei.

Diese kann man im einfachsten Fall von Hand schreiben, alternativ kann man sie aber auch automatisiert von einem entsprechenden Werkzeug erzeugen lassen. npm bringt ein entsprechendes Kommando von Haus aus mit. Führt man

$ npm init

auf der Konsole aus, erfragt npm die wichtigsten Konfigurationsoptionen und generiert die Datei package.json. Führt man diesen Vorgang regelmäßig aus, bietet sich der Einsatz von grunt-init oder eines ähnlichen Werkzeugs an.

Außer den obligatorischen Feldern name und version sollte man zusätzlich eine description aufnehmen, den author und die dependencies angeben, und das Repository spezifizieren, in dem der Quelltext des Moduls hinterlegt ist. Darüber hinaus ist es außerdem sinnvoll, die Eigenschaft main hinzuzufügen, die den Einstiegspunkt für das Modul definiert.

Als Beispiel kann an dieser Stelle die (leicht gekürzte) Datei package.json des Moduls node-assertthat dienen, welches eine flüssige TDD-Syntax für Node.js bereitstellt:

{
"name": "node-assertthat",
"version": "0.0.19",
"description": "node-assertthat provides a fluent TDD style ⏎
for Node.js: assert.that(actual, is.equalTo(expected));",
"author": "Golo Roden <webmaster@goloroden.de> ⏎
(http://www.goloroden.de)",
"main": "./lib/assert.js",
"dependencies": {
"comparejs": "0.0.11"
},
"repository": {
"type": "git",
"url": "https://github.com/goloroden/node-assertthat"
}
}

Hinweis: Der Zeilenumbruch darf nicht eingegeben werden, er dient lediglich der Formatierung zur besseren Lesbarkeit.

Gelegentlich entwickelt man Module ausschließlich für den internen Gebrauch und möchte daher verhindern, dass es versehentlich veröffentlicht wird. Zu diesem Zweck kann man der Datei package.json die Eigenschaft private hinzufügen und dieser den Wert true zuweisen:

[...]
"main": "./lib/assert.js",
"private": true,
"dependencies": {
[...]

Trifft npm auf diesen Eintrag, verweigert es jeglichen Versuch, das Modul zu veröffentlichen, und gibt eine entsprechende Fehlermeldung aus:

npm ERR! Error: This package has been marked as private
npm ERR! Remove the 'private' field from the package.json to
publish it.
[...]

Vor der Veröffentlichung eines Moduls sollte man zunächst lokal testen, ob alles wie gewünscht funktioniert. Dies umfasst zum einen einen rein funktionalen Test, den man beispielsweise mit Hilfe von Unittests und einem Werkzeug wie Grunt weitestgehend automatisieren kann.

Zum anderen empfiehlt sich aber auch, die Installation zu prüfen. Dafür stellt npm das Kommando pack zur Verfügung, das man innerhalb jenes Verzeichnisses aufrufen muss, das auch die Datei package.json enthält:

$ npm pack

Das Ergebnis ist eine .tgz-Datei, die all das enthält, was beim Veröffentlichen des Moduls freigegeben würde. Diese Datei kann man dann beispielsweise entpacken, um ihren Inhalt zu kontrollieren.

Außerdem kann man npm auch derart verwenden, ein Modul direkt aus einer lokalen .tgz-Datei heraus zu installieren, indem man dem Kommando install den Dateinamen als Parameter übergibt:

$ npm install node-assertthat-0.0.19.tgz

Auf diesem Weg installiert npm das Modul auf die gleiche Art in das Verzeichnis node_modules, wie es es auch bei einem bereits veröffentlichten Modul getan hätte.

Hat man alle Tests erfolgreich durchgeführt, ist es an der Zeit, das Modul tatsächlich freizugeben. Auch hierzu dient npm, wobei man vor dem ersten Veröffentlichen zunächst ein Benutzerkonto anlegen muss.

Die geschieht mit dem Kommando adduser, das den gewünschten Benutzernamen, ein Kennwort und eine E-Mail-Adresse erfragt:

$ npm adduser
Username: goloroden
Password: ***************
Email: webmaster@goloroden.de

Die eingegebenen Daten werden in der Datei ~/.npmrc hinterlegt, sodass man im Bedarfsfall zukünftig automatisch angemeldet wird.

Danach kann man ein Modul veröffentlichen, indem man das Kommando publish von npm verwendet. Auch dieses Kommando muss man aus dem Verzeichnis aufrufen, das die Datei package.json enthält:

$ npm publish

Im Hintergrund erzeugt npm nun zunächst die gleiche .tgz-Datei, die zuvor das Kommando pack erzeugt hatte, und überträgt sie anschließend in die öffentliche Datenbank von npm. Nun lässt sich das Modul von jedem interessierten Entwickler auf dem üblichen Weg installieren.

Das Aktualisieren eines Moduls erfolgt prinzipiell auf dem gleichen Weg: Auch hier nimmt man zuerst die gewünschten Änderungen vor, führt verschiedene Tests aus und veröffentlicht das Modul, indem man npm mit dem publish-Kommando aufruft.

Zu beachten ist dabei lediglich, dass man die Versionsnummer in der Datei package.json anpasst, da npm den Veröffentlichungsvorgang ansonsten verweigert, weil das Modul in der angegebenen Version bereits veröffentlicht wurde.

tl;dr: Das Veröffentlichen eigener Module fällt dank npm ausgesprochen leicht: Es genügt, einem Modul die Datei package.json hinzuzufügen und ein Benutzerkonto mit Hilfe des adduser-Kommandos einzurichten. Anschließend kann man das Modul mit der Anweisung npm publish veröffentlichen, sodass es für jeden interessierten Entwickler zur Verfügung steht. ()