Ich habe mehrere Apps im Knoten, die alle einige Module gemeinsam nutzen, die ich geschrieben habe. Diese Module sind nicht über npm verfügbar. Ich möchte in der Lage sein, frei zwischen Apps zu teilen, aber ich möchte keine Verzeichnisse kopieren oder mich darauf verlassen, dass Git dies tut. Und ich bin auch nicht besonders begeistert davon, Symlinks zu verwenden, um dies zu tun.
Ich möchte Verzeichnisse wie folgt anordnen:
app1
server.js
node_modules
(public modules from npm needed for app1)
lib
(my own modules specific to app1)
app2
server.js
node_modules
(public modules from npm needed for app2)
lib
(my own modules specific to app2)
shared_lib
(my own modules that are used in both app1 and app2)
Das Problem, das ich sehe, ist, dass die Module in shared_lib verwirrt zu sein scheinen, wo sich die Module befinden, die sich im Verzeichnis node_modules der App befinden, in der sie ausgeführt werden. Zumindest denke ich, dass dies das Problem ist.
Also ... was ist ein guter Weg, um Duplikate von Dateien zu vermeiden? (Beachten Sie, dass ich mich nicht um Duplikate von Dingen in node_modules kümmere, da diese nicht mein Code sind und ich sie nicht in Git usw. einchecke.)
In der npm-Dokumentation wird empfohlen, npm-link zu verwenden, um Ihre eigenen Node.js-Pakete lokal zu erstellen und sie dann anderen Node.js-Anwendungen zur Verfügung zu stellen. Es ist ein einfacher vierstufiger Prozess.
Ein typisches Verfahren wäre, zuerst ein Paket mit der folgenden Struktur zu erstellen:
Eine typische Implementierung dieser Dateien wäre:
index.js
exports.world = function() { return('Hello World'); }
package.json
{ "name": "hello", "version": "0.0.1", "private": true, "main": "index.js", "dependencies": { }, "engines": { "node": "v0.6.x" } }
"private: true" stellt sicher, dass npm die Veröffentlichung des Pakets verweigert. Dies ist eine Möglichkeit, die versehentliche Veröffentlichung privater Pakete zu verhindern.
Navigieren Sie als Nächstes zum Stammverzeichnis Ihres Node.js-Paketordners und führen Sie es aus
npm link
, um das Paket global zu verknüpfen, damit es in anderen Anwendungen verwendet werden kann.So verwenden Sie dieses Paket in einer anderen Anwendung, z. B. "Hallo Welt", mit der folgenden Verzeichnisstruktur:
Navigieren Sie zum Ordner "Hallo Welt" und führen Sie Folgendes aus:
Jetzt können Sie es wie jedes andere npm-Paket wie folgt verwenden:
app.js.
var http = require('http'); var hello = require('hello'); var server = http.createServer(function(req, res) { res.writeHead(200); res.end(hello.world()); }); server.listen(8080);
quelle
Verwenden Sie einfach den richtigen Pfad in Ihrem gewünschten Anruf
Zum Beispiel in server.js wäre das:
Es ist wichtig zu wissen, dass der Pfad relativ zur aufrufenden Datei ist, sobald Ihrem Pfad '/', '../' oder './' vorangestellt ist.
Weitere Informationen zum Laden von Knotenmodulen finden Sie unter: http://nodejs.org/docs/latest/api/modules.html
quelle
Ja, Sie können auf shared_lib von app1 aus verweisen, aber dann tritt ein Problem auf, wenn Sie app1 in einer anderen Umgebung, z. B. einem Webserver in AWS, verpacken und bereitstellen möchten.
In diesem Fall ist es besser, Ihre Module in shared_lib auf app1 und app2 mit "npm install shared_lib / module" zu installieren. Außerdem werden alle Abhängigkeiten der shared_lib-Module in App1 und App2 installiert und Konflikte / Duplikate behandelt.
Siehe dies: Wie installiere ich ein privates NPM-Modul ohne meine eigene Registrierung?
quelle
Wenn Sie die Dokumente von node.js auschecken , werden Sie feststellen , dass Node.js das
package.json
Dateiformat zumindest flüchtig versteht.Wenn Sie ein Verzeichnis mit dem Namen
foo
haben und sich in diesem Verzeichnis einepackage.json
Datei mit dem Schlüssel-Wert-Paar befindet:"main": "myCode.js"
Wenn Sie versuchen,require("foo")
dieses Verzeichnis mit einer darin enthaltenenpackage.json
Datei zu finden, wird esfoo/myCode.js
für dasfoo
Modul verwendet.Wenn also in Ihrer Verzeichnisstruktur jede gemeinsam genutzte Bibliothek ein eigenes Verzeichnis mit einer so einfachen
package.json
Datei enthält, können Ihre Apps die gemeinsam genutzten Bibliotheken abrufen, indem Sie:var lib1 = require('../shared_lib/lib1'); var lib2 = require('../shared_lib/lib2');
Und das sollte für beide Apps funktionieren.
quelle