Lokale Abhängigkeit in package.json


452

Ich möchte so etwas tun, npm installinstalliert also auch die Abhängigkeiten package.jsonvon ../somelocalliboder, was noch wichtiger ist.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Antworten:


580

npm> = 2.0.0

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

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

Jeder der folgenden Pfade ist ebenfalls gültig:

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

Das lokale Paket wird in das Präfix ( ) kopiert ../node-modules

npm <2.0.0

Setzen Sie somelocallibals Abhängigkeit in Ihre package.jsonwie gewohnt:

"dependencies": {
  "somelocallib": "0.0.x"
}

Führen Sie dann run aus npm link ../somelocallibund npm installiert die Version, an der Sie arbeiten, als Symlink .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Referenz: Link (1)


3
Wie können wir die Verknüpfung aufheben?
AtaurRehman Asad

13
Der Nachteil der Installation lokaler Pakete mit "npm link" ist, dass Sie viele Modul-Duplikationen erhalten. Wenn Sie Ihre Abhängigkeiten mit "module: version" oder "module: git-repo" auflisten, vermeiden Sie der npm-Installationsalgorithmus, ein Paket zu installieren, das bereits in einem übergeordneten Paket installiert ist. Wenn also mit "npm link" Ihre Hauptanwendung von "async@0.8.0" abhängt und alle Ihre lokalen Pakete auch von "async@0.8.0" abhängen, werden alle lokalen Pakete "async@0.8" installieren. 0 "anstatt dieselbe installierte" asynchrone "Version der Hauptanwendung zu verwenden. Dies geschieht nicht mit "npm install folder".
Pedro Ballesteros

3
@PedroBallesteros können Sie verwenden npm dedup, um dieses Problem zu beheben. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"Das lokale Paket wird kopiert ..." scheint bei einer neueren npm-Version nicht der Fall zu sein. Jetzt wird ein Symlink erstellt.
Tsauerwein

2
@danilopopeye In der Beschreibung von docs.npmjs.com/cli/install npm install <folder> heißt es: Installieren Sie das Paket im Verzeichnis als Symlink im aktuellen Projekt.
Herman J. Radtke III

211

Es ist jetzt möglich, lokale Installationspfade für Knotenmodule package.jsondirekt in Ihrem anzugeben . Aus den Dokumenten:

Lokale Pfade

Ab Version 2.0.0 können Sie einen Pfad zu einem lokalen Verzeichnis angeben, das ein Paket enthält. Lokale Pfade können mit npm install -Soder npm install --savemit einem der folgenden Formulare gespeichert werden :

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

In diesem Fall werden sie auf einen relativen Pfad normalisiert und zu Ihrem hinzugefügt package.json. Zum Beispiel:

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

Diese Funktion ist hilfreich für die lokale Offline-Entwicklung und das Erstellen von Tests, für die eine npm-Installation erforderlich ist, bei der Sie keinen externen Server erreichen möchten, die jedoch nicht zum Veröffentlichen von Paketen in der öffentlichen Registrierung verwendet werden sollte.


23
In npm v.3 + ist die Normalisierung absolut und nicht relativ , so dass Sie so etwas wie"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Wie kann ich die lokale Pfadabhängigkeit aktualisieren, ohne die Version zu erhöhen?
Bohdan Lyzanets

3
Dies verursacht übrigens alle Arten von Problemen, wenn und / oder wenn Sie versuchen, Ihre Knotenanwendung zu dockerisieren, da die Standardabbilder node:onbuildnur das aktuelle Verzeichnis kopieren und somit alles weglassen ../foo.
Donmartin

4
Gibt es eine Möglichkeit, dies in git + ssh zu integrieren, sodass entweder eine lokale Kopie des Git-Repositorys, aus dem sie stammen, npm installoder ein anderes Git-Repository im LAN vorhanden ist? Wenn ich die obige und npm-Installation von git + ssh aus versuche, scheint sie im Verzeichnis node_modules zu suchen und nicht zu versuchen, über git + ssh zu gehen, obwohl ich auf diese Weise das Paket der obersten Ebene installiere.
Michael

1
Arbeit installieren. Auf diese Weise wird beim Versuch, das Modul in mein Projekt zu importieren, "ERR nicht gefunden" angezeigt.
C4d

87

Das funktioniert bei mir.

Fügen Sie Folgendes in Ihre Datei package.json ein

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
Vielen Dank für den Vorschlag, der nicht die Verwendung von "npm link" erfordert
ItalyPaleAle

Es wurde .gitignoreim Modulordner entfernt, erstellt .npmignoreund beim ersten Ausführen 777 rekursiv auf alle Ordner außer angewendet node_modules. Aber ja, es hat die Abhängigkeiten installiert. Verwenden von npm Version 1.4.14.
L0LN1NJ4

habe dies verwendet, aber anstatt mit node_modules herumzuspielen, habe ich app_modules verwendet
Catalint

1
Warum nicht "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets

1
Ich stimme @Bohdan hier zu. localdependencies machen genau das Gleiche. Der Vorteil der Verwendung npm linkbesteht darin, dass Sie nicht npm installjedes Mal etwas tun müssen, um Ihre Abhängigkeiten auf den neuesten Stand zu bringen.
Froginvasion

30

Wenn Sie dies weiter automatisieren möchten, weil Sie Ihr Modul in die Versionskontrolle einchecken und sich nicht darauf verlassen möchten, dass Entwickler sich an den npm-Link erinnern, können Sie dies Ihrem Abschnitt "scripts" zu package.json hinzufügen:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Das fühlt sich jenseits von Hacky an, aber es scheint "zu funktionieren". Ich habe den Tipp von dieser npm-Ausgabe erhalten: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
Warum postinstallund postupdatestatt preinstallund preupdate?
Rechtsfalte

1
Könnten Sie etwas näher erläutern, was dies bewirkt? Wenn ich also ein vscode-Projekt mit mehreren Stammordnern (dh "Multi-Root-Arbeitsbereich") einrichte, kann es Änderungen im Modulordner sofort für die konsumierenden Projekte widerspiegeln? - Geht es bei diesem Hack darum?
Bvdb

26

So fügen Sie lokale Abhängigkeiten hinzu:

npm install file:src/assets/js/FILE_NAME

Fügen Sie es zu package.json von NPM hinzu:

npm install --save file:src/assets/js/FILE_NAME

Fügen Sie direkt zu package.json wie folgt hinzu:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

Masterprojekt

Hier ist die package.json, die Sie für das Masterprojekt verwenden werden:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Dort ./somelocallibbefindet sich der Verweis auf den Bibliotheksordner relativ zum Masterprojekt package.json .

Referenz: https://docs.npmjs.com/files/package.json#local-paths


Unterprojekt

Behandeln Sie Ihre Bibliotheksabhängigkeiten.

Neben dem Laufen npm install müssen Sie laufen (cd node_modules/somelocallib && npm install).

Dies ist ein bekannter Fehler bei NPM.

Referenz: https://github.com/npm/npm/issues/1341 (auf der Suche nach einer aktuelleren Referenz)


Hinweise für Docker

Checken Sie Ihren Master package.lockund Ihren einsomelocallib/package.lock Quellcode-Manager ein.

Dann verwenden Sie in Ihrer Docker-Datei:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Ich verwende Klammern in meinen (cd A && B)Konstrukten, um die Operation idempotent zu machen.


3

Ich weiß, dass das npm install ../somelocallibfunktioniert.

Ich weiß jedoch nicht, ob die in der Frage angezeigte Syntax von package.json...

Leider scheint doc URL nur als Abhängigkeit zu erwähnen.

Versuchen Sie file:///.../...tar.gz, auf eine komprimierte lokale Bibliothek zu zeigen ... und sagen Sie uns, ob es funktioniert.


1
Ich füge "abhängigkeiten": {"somemodule": "file: ///./internal_modules/somemodule"} zu package.json hinzu. Es funktioniert nicht. Fehlercode ist "npm ERR! Code E404".
Jeffrey

2

Das hat bei mir funktioniert: Stellen Sie zunächst sicher, dass die npm-Verzeichnisse den richtigen Benutzer haben

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Dann verknüpfen Sie in Ihrer package.json das Verzeichnis

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
Symbolische Links unter Windows sind seit XP en.wikipedia.org/wiki/NTFS_symbolic_link möglich . Öffnen Sie die Befehlszeile als Administrator und führen Sie sie aus npm install.
Sod

2

Ab npm 2.0 werden jetzt lokale Pfade unterstützt (siehe hier ).


8
Michael Trouw gab diese Antwort bereits einige Wochen zuvor. Warum also duplizieren?
Dan Dascalescu

2

Neugierig ..... zumindest unter Windows (meine npm ist 3.something) musste ich tun:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Wenn ich eine machte npm install ../module1 --save, führte dies zu absoluten Pfaden und nicht relativ gemäß der Dokumentation.

Ich spielte ein bisschen mehr herum und stellte fest, dass ../xxxdas ausreichend war.

Insbesondere habe ich die lokalen Knotenmodule ausgecheckt, um d: \ build \ module1, d: \ build \ module2 und mein Knotenprojekt (Anwendung) in d: \ build \ nodeApp zu sagen.

Um 'zu installieren', ich:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

package.json von module1 hat die Abhängigkeit von "module2": "../module2"; Modul2 hat keine lokale Abhängigkeit; nodeApp hat Abhängigkeiten "module1": "../module1" und "module2": "../module2".

Ich bin mir nicht sicher, ob dies nur bei mir funktioniert, da sich alle 3 Ordner (Modul1, Modul2 und NodeApp) auf derselben Ebene befinden .......


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.