Ein lokales Modul mit npm installieren?

416

Ich habe ein heruntergeladenes Modul-Repo. Ich möchte es lokal installieren, nicht global in einem anderen Verzeichnis.

Was ist ein einfacher Weg, dies zu tun?

schick
quelle

Antworten:

479

Aus der npm-Link-Dokumentation :

Im lokalen Modulverzeichnis:

$ cd ./package-dir
$ npm link

Im Verzeichnis des Projekts, in dem das Modul verwendet werden soll:

$ cd ./project-dir
$ npm link package-name

Oder auf einmal mit relativen Pfaden:

$ cd ./project-dir
$ npm link ../package-dir

Dies entspricht der Verwendung von zwei Befehlen oben unter der Haube.

Reiches Apodaca
quelle
14
Dies ist der einzige vernünftig aussehende Ansatz, den ich bisher gesehen habe - warum npm so dunkel / stumpf sein muss w. Ich weiß nicht, ob ein lokales Paket erstellt, installiert und dann verwendet werden soll ... Link funktioniert (und es ist großartig), aber die Terminologie ist ziemlich verwirrend.
Smaudet
6
@ Rich Apodaca, danke für den Doc Link. Der Vorgang wird nicht rückgängig gemacht. Es sieht so aus, als würde es nur Symlinks erstellen, damit ich diese wie gewohnt entfernen kann.
Tyler Collier
1
@ TylerCollier npm Unlink scheint die spiegelbildliche Operation stackoverflow.com/a/24940024/54426
Rich Apodaca
1
Nur eine Anmerkung, wenn Sie Angular2 (oder vielleicht andere Anwendungen?) Verwenden, gibt es einige Summen um npm-Verknüpfungen, die die Hauptursache für bestimmte Probleme sind. Beispiel hier und hier
Die rote Erbse
4
Beachten Sie jedoch, dass dadurch npm linkeine zweite Instanz externer Abhängigkeiten erstellt wird. Wenn Sie also ein Paket A haben, das B und C benötigt, benötigt B C. Wenn Sie B verknüpfen, hat Anwendung A zwei Instanzen von C.
user2167582
421

Sie geben nur ein <folder>Argument an npm install, das Argument sollte auf den lokalen Ordner anstatt auf den Paketnamen verweisen:

npm install /path
schick
quelle
5
Im Gegensatz zu link wird hier .npmignore verwendet.
Camille Wintz
30
@bithavoc Zumindest ab npm 5 wird durch die Installation eines Ordners ein Symlink erstellt, keine Kopie. Siehe docs.npmjs.com/cli/install
Frank Tan
3
Ich habe versucht, diese Methode zu verwenden, aber mein Modul kann die PeerDependencies nicht finden.
Witalo Benicio
1
Es ist schön, rm -rf node_modulesbevor und npm installnachdem Sie das Skript der Antwort ausgeführt haben.
Renato Zurück
2
@FrankTan Ja, aber wie bekommt man das alte Verhalten? Ich möchte die Kopie!
Michael
150

Da ich von derselben Person gefragt und beantwortet wurde, füge ich einen npm-Link hinzu alternativ .

aus docs:

Dies ist praktisch, um Ihre eigenen Inhalte zu installieren, damit Sie daran arbeiten und sie iterativ testen können, ohne sie ständig neu erstellen zu müssen.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Bearbeiten] Ab NPM 2.0 können Sie lokale Abhängigkeiten in package.json deklarieren

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W.
quelle
11
Es ist vielleicht nicht die ursprüngliche Absicht der Frage, aber es ist wahrscheinlich das, was die meisten Leute, die dies über Google finden, wollen.
Dusty J
1
Diese Antwort scheint unvollständig zu sein. Sie müssen npm linkden Ordner einmal ausführen (um einen globalen Symlink zu erstellen) und dann npm link package-nameim Ordner des Projekts ausführen (um den globalen Symlink in Ihrem Projekt zu verwenden). Die Antwort unten ist die richtige Antwort.
Thomas Potaire
8
@ThomasPotaire beide Antworten sind richtig. Wenn Sie sich die Dokumentation zu npm link ansehen, werden beide Methoden vorgestellt, wobei dieser relative Verzeichnisansatz eine Abkürzung ist.
MJ
1
Die zweite Methode (unter Verwendung des file:Ansatzes) ermöglichte es meiner App und dem lokalen Modul, eine Abhängigkeit gemeinsam zu nutzen. Mein Test von npm linkergab eine doppelte Abhängigkeit, die Dinge bricht, wenn die Abhängigkeit als Singleton verwendet werden muss.
Daniel Waltrip
Ich hatte ein lokales Paket (sagen wir Paket1), Paket2 hat eine Abhängigkeit, die mit dem relativen Pfad von Paket1 erwähnt wird. npm Ich installiere das Paket nicht, wenn der relative Pfad mit "file: ../../ package1" beginnt. Funktioniert es, wenn es '' ../../package1 "ist. Bedeutet das Hinzufügen einer Datei am Anfang etwas anderes?
Dip686
15

npm pack + package.json

Das hat bei mir funktioniert:

SCHRITT 1: Führen Sie module projectFolgendes aus npm pack:

Dies wird eine <package-name>-<version>.tar.gz Datei erstellt.

SCHRITT 2: Verschieben Sie die Datei in die consumer project

Im Idealfall können Sie alle diese Dateien in einem tmpOrdner in Ihrem consumer-projectStammverzeichnis ablegen:

SCHRITT 3: Lesen Sie es in Ihrem package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

SCHRITT 4: Installdie Pakete:

npm installoder npm ioderyarn

Ihr Paket sollte in Ihrem consumer-project's node_modulesOrdner verfügbar sein .

Viel Glück...

Akash
quelle
9

Keiner dieser Ansätze ( npm linkoder package.jsonDateiabhängigkeiten) funktioniert, wenn das lokale Modul Peer-Abhängigkeiten aufweist, die Sie nur im Bereich Ihres Projekts installieren möchten.

Zum Beispiel:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

In diesem Szenario npm setzt auf myprojects‘ node_modules/wie folgt aus :

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Wenn der Knoten geladen wird mymoduleund dies tut require('foo'), löst der Knoten den mymoduleSymlink auf und sucht dann nur nach /local/mymodule/node_modules/(und seinen Vorfahren) foo, nach denen er nicht findet. Stattdessen möchten wir, dass der Knoten nachschaut /local/myproject/node_modules/, da dort und wo unser Projekt ausgeführt wurdefoo installiert wurde.

Also müssen wir entweder einen Weg Knoten zu sagen, nicht dieses Symlink lösen , wenn Sie suchen foo, oder wir müssen einen Weg npm anweisen , eine Installation Kopie von mymodule, wenn die Dateiabhängigkeit Syntax in verwendet package.json. Ich habe leider auch keinen Weg gefunden :(

Paul Medynski
quelle
Ich fand eine Abhilfe, die eingestellt ist , NODE_PATHum Punkt auf dem node_modules/wo fooinstalliert ist. Für den obigen Fall wäre es also: NODE_PATH=/dev/myproject/node_modules/ Das erlaubt mymodulezu finden foo.
Paul Medynski
Es gibt eine Lösung für. Legen Sie die Abhängigkeitsmodule im Projektstammordner ab . Definieren Sie Ihre Abhängigkeiten in package.json mit dem üblichen Präfix 'file:' . Do npm i Dadurch wird ein Symlink in den node_modules des Projekts erstellt, und seine Abhängigkeiten können wie bei anderen Arten von Abhängigkeiten auf die node_modules der obersten Ebene angehoben werden. Meine npm-Version ist v6.14.4. Nachdem Sie einige Stunden damit verbracht haben, dieses Problem zu beheben, finden Sie diese Lösung hier: ( atmos.washington.edu/~nbren12/reports/journal/… ). Danke nbren12.
Sasebot
Ich hatte die gleichen Probleme. Ich habe diese Antwort gefunden: stackoverflow.com/questions/50807329/… , dies löst mein Problem mit Peer-Abhängigkeiten und lokalen Bibliotheken.
Theawless
0

Vermissen Sie das Haupteigentum?

Wie bisherige Leute geantwortet haben npm --save ../location-of-your-packages-root-directory. Das ../location-of-your-packages-root-directorymuss jedoch zwei Dinge haben, damit es funktioniert.

1) package.jsonin diesem Verzeichnis zeigte auf

2) mainEigenschaft in der package.jsonmuss gesetzt sein und funktioniert ig "main": "src/index.js",wenn die Eintragsdatei für ../location-of-your-packages-root-directoryist../location-of-your-packages-root-directory/src/index.js

K - Die Toxizität in SO nimmt zu.
quelle