wie man lokale Module als npm-Paketabhängigkeiten angibt


267

Ich habe eine Anwendung, die die üblichen Abhängigkeiten von Modulen von Drittanbietern (z. B. 'Express') aufweist, die in der Datei package.json unter Abhängigkeiten angegeben sind. Z.B

"express"     : "3.1.1"

Ich möchte meinen eigenen Code modular strukturieren und eine Reihe lokaler (dh auf dem Dateisystem, in dem ich mich gerade befinde) Module von package.json installieren lassen. Ich weiß, dass ich ein lokales Modul installieren kann, indem ich Folgendes ausführe:

npm install path/to/mymodule

Ich weiß jedoch nicht, wie ich dies über die Abhängigkeitsstruktur package.json erreichen kann. Wenn Sie die --saveOption in diesem Befehl verwenden, wird sie einfach "mymodule": "0.0.0"in meine package.json eingefügt (verweist nicht auf den Speicherort des Dateipfads). Wenn ich dann die installierte Version aus node_modules entferne und versuche, sie erneut aus der package.json zu installieren, schlägt dies fehl (weil sie in der zentralen Registrierung nach "mymodule" sucht und nicht lokal sucht).

Ich bin sicher, dass dies eine Möglichkeit ist, der "dependencies": {}Struktur mitzuteilen , dass sie über einen Dateisystempfad installiert werden soll, aber ich weiß nicht wie.

Hat noch jemand dieses Problem gehabt? Vielen Dank.


1
Eine wirklich gute Frage. Es ist traurig zu erkennen, dass es kein Merkmal gibt, das dem entspricht package.json, was wir in Gemfiles haben.
Jarl

3
mögliches Duplikat der lokalen Abhängigkeit in package.json
Kelly

Antworten:


401

npm install unterstützt dies jetzt

npm install --save ../path/to/mymodule

Damit dies funktioniert, mymodulemuss es als eigenes Modul konfiguriert sein package.json. Siehe Erstellen von NodeJS-Modulen .

Ab npm 2.0 werden lokale Abhängigkeiten nativ unterstützt. Siehe Danilopopeyes Antwort auf eine ähnliche Frage . Ich habe seine Antwort hier kopiert, da diese Frage in den Web-Suchergebnissen einen sehr hohen Stellenwert hat.

Diese Funktion wurde in der Version 2.0.0 von npm implementiert. Beispielsweise:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Jeder der folgenden Pfade ist ebenfalls gültig:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Aktualisieren von Updates

Seit dem npm installKopieren mymodulein node_moduleswerden Änderungen in mymoduleder Quelle vom abhängigen Projekt nicht automatisch angezeigt.

Es gibt zwei Möglichkeiten, das abhängige Projekt mit zu aktualisieren

  • Aktualisieren Sie die Version von mymoduleund verwendennpm update Sie dann : Wie Sie oben sehen können, enthält der package.jsonEintrag "Abhängigkeiten" keinen Versionsspezifizierer, wie Sie es für normale Abhängigkeiten sehen würden. npm updateVersuchen Sie stattdessen bei lokalen Abhängigkeiten nur sicherzustellen, dass die neueste Version installiert ist, wie durch mymodule's festgelegt package.json. Siehe die Antwort von chriskelly auf dieses spezielle Problem .

  • Neu installieren mit npm install. Dadurch wird alles installiert, was sich im Quellpfad befindet mymodule, auch wenn es älter ist oder ein alternativer Zweig ausgecheckt ist.


2
Das hat bei mir funktioniert. (Ich habe gerade einen lokalen relativen Pfad wie"mymodule":"file:mymoduledir"
Don Rhummy

72
npm install --save ../my-local-repo
Ivan Rave

15
Und wie benutzt man es im Projekt? Ich versuche es so zu nennen import { HelloWorld } from "my-test-lib";, aber ich erhalte den Fehler "Cant find module". Bitte werfen Sie einen Blick auf stackoverflow.com/questions/46818083/…
Vitalii Vasylenko

6
@ LucioMollinedo Können Sie die Syntax für den Import des lokalen Moduls freigeben? Wie bei Vitallii erhalte ich den Fehler "Can't fine module" mitimport { HelloWorld } from "my-test-lib";
Stan James

7
Dies funktioniert nicht genauso wie das Verweisen auf ein Paket, da Abhängigkeiten nicht im Projekt installiert werden
Glass Cannon


11

local_modulesAm Ende konnte ich keinen ordentlichen Weg finden, also habe ich ein Verzeichnis mit dem Namen erstellt und dieses Bashscript der Datei package.json in scripts-> preinstall hinzugefügt

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

Nachdem ich mit dem npm linkBefehl viel zu kämpfen hatte (Lösungsvorschlag für die Entwicklung lokaler Module, ohne sie in einer Registrierung zu veröffentlichen oder eine separate Kopie im Ordner node_modules zu verwalten), habe ich ein kleines npm-Modul erstellt, um dieses Problem zu beheben.

Das Update erfordert zwei einfache Schritte .

Zuerst:

npm install lib-manager --save-dev

Zweitens fügen Sie dies zu Ihrem hinzu package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Weitere Informationen finden Sie unter https://www.npmjs.com/package/lib-manager . Hoffe es hilft jemandem.


0

Wenn es akzeptabel ist, Ihre in node_modules vorinstallierten Module einfach zusammen mit Ihren anderen Dateien zu veröffentlichen, können Sie dies folgendermaßen tun:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Möglicherweise möchten Sie Ihr Modul auch auf git speichern und Ihrem übergeordneten package.json mitteilen, dass es die Abhängigkeit von git installieren soll: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
Leider würde dies bedeuten, dass bei node_modules meine lokalen Module und Module von Drittanbietern / Beiträgen aus der Registrierung (z. B. connect) im selben Verzeichnis installiert werden. Abgesehen davon, dass dies aus Git / VCS-Sicht verwirrend ist (dh alle in node_modules außer den von mir erstellten ignorieren müssten), ist es auch eine schlechte Praxis (diejenigen, die ich geschrieben habe und die nicht veröffentlicht wurden, sollten getrennt von denen gehalten werden, die andere geschrieben und veröffentlicht haben ).
Sam Adams

Wenn ich ein lokales Modul hinzufüge und Änderungen vornehme, werden diese von meiner Haupt-App nicht angezeigt. Warum ist das so?
Mark Tyers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.