Dipendenza locale in package.json


453

Voglio fare qualcosa di simile, quindi npm installinstalla anche il package.jsondi ../somelocallibo più importante le sue dipendenze.

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

Risposte:


583

npm> = 2.0.0

Questa funzione è stata implementata nella versione 2.0.0 di npm. Esempio:

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

È valido anche uno dei seguenti percorsi:

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

Il pacchetto locale verrà copiato nel prefisso ( ./node-modules).

npm <2.0.0

Metti somelocallibcome dipendenza nel tuo package.jsonnormale:

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

Quindi esegui npm link ../somelocallibe npm installerà la versione su cui stai lavorando come link simbolico .

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

Riferimento: link (1)


3
Come possiamo scollegarlo?
AtaurRehman Asad,

13
Il rovescio della medaglia dell'installazione di pacchetti locali con "npm link" è che si ottiene molta duplicazione del modulo. Quando si elencano le dipendenze con "module: version" o "module: git-repo", l'algoritmo npm install evita di installare un pacchetto che è già installato in un pacchetto parent. Quindi con "npm link", se la tua applicazione principale dipende da "async@0.8.0" e tutti i tuoi pacchetti locali dipendono anche da "async@0.8.0" finirai con tutti i pacchetti locali che installano "async@0.8. 0 "invece di utilizzare la stessa versione" asincrona "installata dell'applicazione principale. Questo non accade usando "npm install folder".
Pedro Ballesteros,

3
@PedroBallesteros è possibile utilizzare il npm dedupper risolvere questo problema. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"Il pacchetto locale verrà copiato ..." non sembra essere il caso di una versione npm più recente. Ora viene creato un collegamento simbolico.
tsauerwein,

2
@danilopopeye Per docs.npmjs.com/cli/install la npm install <folder> descrizione dice Installa il pacchetto nella directory come link simbolico nel progetto corrente.
Herman J. Radtke III

211

Ora è possibile specificare package.jsondirettamente i percorsi di installazione del modulo Node locale . Dai documenti:

Percorsi locali

A partire dalla versione 2.0.0 è possibile fornire un percorso a una directory locale che contiene un pacchetto. I percorsi locali possono essere salvati utilizzando npm install -So npm install --save, utilizzando uno di questi moduli:

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

nel qual caso verranno normalizzati in un percorso relativo e aggiunti al tuo package.json. Per esempio:

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

Questa funzione è utile per lo sviluppo offline locale e la creazione di test che richiedono l'installazione di npm in cui non si desidera colpire un server esterno, ma non devono essere utilizzati quando si pubblicano pacchetti nel registro pubblico.


23
In npm v.3 +, la normalizzazione è assoluta, non relativa , quindi vedrai qualcosa di simile"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Come aggiornare la dipendenza del percorso locale senza l'incremento della versione?
Bohdan Lyzanets,

3
A proposito, questo causa tutti i tipi di problemi quando e / o se si tenta di agganciare l'applicazione del nodo, poiché le node:onbuildimmagini standard copiano solo la directory corrente e quindi tralasciano qualsiasi cosa ../foo.
donmartin,

4
c'è un modo per integrarlo con git + ssh in modo da poter avere una copia locale del repository git da loro npm installo un altro repository git sulla LAN? Quando provo il precedente e npm install da git + ssh sembra cercare nella directory node_modules e non tentare di andare su git + ssh anche se è così che sto installando il pacchetto di livello superiore.
Michael,

1
Installazione di lavoro. Ma in questo modo otterrò "ERR non trovato" quando provo a importare il modulo nel mio progetto.
C4d,

87

Questo funziona per me.

Inserire quanto segue nel file package.json

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

4
Grazie per il suggerimento che non richiede l'uso di "npm link"
ItalyPaleAle

È stato rimosso .gitignorenella cartella del modulo, creato .npmignoree la prima volta che l'ho eseguito ha applicato 777 in modo ricorsivo su tutte le cartelle tranne node_modules. Ma sì, ha installato le dipendenze. Utilizzando npm versione 1.4.14.
L0LN1NJ4,

usato questo, ma invece di fare casini con node_modules ho usato app_modules
catalint

1
Perché no "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets,

1
Sono d'accordo con @Bohdan qui. le localdipendenze faranno esattamente la stessa cosa. Il vantaggio dell'utilizzo npm linkè che non è necessario farlo npm installogni volta per aggiornare le proprie dipendenze.
froginvasion,

30

Se vuoi automatizzare ulteriormente questo, perché stai controllando il tuo modulo nel controllo della versione e non vuoi fare affidamento sugli sviluppatori che ricordano il collegamento npm, puoi aggiungerlo alla sezione "script" di package.json:

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

Questo sembra al di là di confusione, ma sembra "funzionare". Ho avuto la mancia da questo numero di npm: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
Perché postinstalle postupdateinvece di preinstalle preupdate?
bendaggio

1
Potresti spiegare un po 'di più cosa fa. ad es. se imposto un progetto vscode con più cartelle root (ad es. "spazio di lavoro multi-root"), sarà in grado di riflettere immediatamente le modifiche nella cartella del modulo per i progetti consumanti? - È di questo che tratta questo hack?
bvdb,

26

Ecco come aggiungere le dipendenze locali:

npm install file:src/assets/js/FILE_NAME

Aggiungilo a package.json da NPM:

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

Aggiungi direttamente a package.json in questo modo:

....
  "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

Progetto principale

Ecco il pacchetto.json che utilizzerai per il progetto principale:

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

Qui ./somelocallibc'è il riferimento alla cartella della libreria rispetto al progetto master package.json .

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


Sotto progetto

Gestisci le dipendenze della tua biblioteca.

Oltre a correre npm install, dovrai correre (cd node_modules/somelocallib && npm install).

Questo è un bug noto con NPM.

Riferimento: https://github.com/npm/npm/issues/1341 (alla ricerca di un riferimento più aggiornato)


Note per Docker

Controlla nel tuo master package.locke somelocallib/package.locknel tuo gestore del codice sorgente.

Quindi nel tuo Dockerfile usa:

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)
# ...

Uso la parentesi nei miei (cd A && B)costrutti per rendere l'operazione idempotente.


3

So che npm install ../somelocallibfunziona.

Tuttavia, non so se la sintassi mostrata nella domanda funzionerà o meno da package.json...

Sfortunatamente, il documento sembra menzionare l'URL solo come dipendenza.

Prova file:///.../...tar.gz, indicando una lib locale zippata ... e dicci se funziona.


1
Aggiungo "dipendenze": {"somemodule": "file: ///./internal_modules/somemodule"} su package.json. Non funziona Il codice di errore è "npm Codice ERR! E404".
Jeffrey,

2

Questo ha funzionato per me: in primo luogo, assicurarsi che le directory npm abbiano l'utente giusto

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

Quindi il tuo nel tuo package.json collega la directory

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

2
Collegamenti simbolici su Windows sono possibili da XP en.wikipedia.org/wiki/NTFS_symbolic_link . Apri la riga di comando come amministratore, quindi esegui npm install.
zolla

2

In realtà, a partire da npm 2.0, ora è disponibile il supporto per i percorsi locali (vedere qui ).


8
Michael Trouw ha già dato questa risposta qualche settimana prima, quindi perché duplicare?
Dan Dascalescu,

2

Curioso ..... almeno su Windows (il mio npm è 3.qualcosa) che dovevo fare:

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

Quando l'ho fatto npm install ../module1 --saveha prodotto percorsi assoluti e non relativi alla documentazione.

Ho rovinato un po 'di più e ho deciso che ../xxxera sufficiente.

In particolare, ho i moduli del nodo locale estratti per dire d: \ build \ module1, d: \ build \ module2 e il mio progetto nodo (applicazione) in d: \ build \ nodeApp.

Per "installare", io:

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 di module1 ha una dipendenza di "module2": "../module2"; module2 non ha dipendenze locali; nodeApp ha dipendenze "module1": "../module1" e "module2": "../module2".

Non sono sicuro che funzioni solo per me poiché tutte e 3 le cartelle (module1, module2 e nodeApp) si trovano sullo stesso livello .......


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.