Installare un modulo locale usando npm?


Risposte:


481

Dalla documentazione di npm-link :

Nella directory del modulo locale:

$ cd ./package-dir
$ npm link

Nella directory del progetto per utilizzare il modulo:

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

O in una volta sola usando i percorsi relativi:

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

Ciò equivale a usare due comandi sopra sotto il cofano.


14
Questo è l'unico approccio sano che ho visto finora - perché npm deve essere così oscuro / ottuso w. per quanto riguarda la creazione di un pacchetto locale, l'installazione e il successivo utilizzo, non so ... link funziona, (ed è fantastico), ma la terminologia è piuttosto confusa.
smaudet,

6
@Rich Apodaca, grazie per il collegamento doc. Non menziona l'annullamento del processo. Sembra che tutto ciò che fa è creare collegamenti simbolici, quindi posso rimuoverli normalmente?
Tyler Collier,

1
@TylerCollier npm unlink sembra essere l'operazione mirror-image stackoverflow.com/a/24940024/54426
Rich Apodaca,

1
Solo una nota, se si utilizza Angular2 (o forse altre applicazioni?), C'è un po 'di buzz attorno al collegamento npm che è la causa principale di un tipo specifico di problema. Esempio qui e qui
il pisello rosso

4
Tuttavia, tenere presente che npm linkcreerà una seconda istanza di dipendenze esterne. Quindi, se hai un pacchetto A che necessita di B e C, B ha bisogno di C. il collegamento B farà sì che l'applicazione A abbia due istanze di C.
user2167582

422

devi solo fornire un <folder>argomento a npm install, l'argomento dovrebbe puntare verso la cartella locale anziché il nome del pacchetto:

npm install /path

5
A differenza del collegamento, utilizza .npmignore.
Camille Wintz,

30
@bithavoc Almeno a partire da npm 5, l'installazione di una cartella ora crea un collegamento simbolico, non una copia. Vedi docs.npmjs.com/cli/install
Frank Tan,

3
Ho provato a usare in questo modo, ma il mio modulo non riesce a trovare le sue peerDependencies.
Witalo Benicio,

1
è bello rm -rf node_modulesprima e npm installdopo aver eseguito lo script della risposta.
Renato Back

3
@FrankTan Sì, ma come ottenere il vecchio comportamento? Io voglio la copia!
Michael,

151

Dato che mi è stato chiesto e risposto dalla stessa persona, in alternativa aggiungerò un link npm .

dai documenti:

Questo è utile per installare le tue cose, in modo che tu possa lavorarci e testarlo iterativamente senza doverlo ricostruire continuamente.

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

[Modifica] A partire da NPM 2.0, è possibile dichiarare dipendenze locali in package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }

11
Potrebbe non essere l'intento originale della domanda, ma è probabilmente quello che vuole la maggior parte delle persone che lo trovano tramite Google.
Dusty J

1
Questa risposta sembra incompleta, è necessario eseguire npm linkuna volta la cartella (per creare un collegamento simbolico globale) e quindi eseguire npm link package-nameall'interno della cartella del progetto (per utilizzare il collegamento simbolico globale nel progetto). La risposta di seguito è la risposta giusta.
Thomas Potaire,

8
@ThomasPotaire entrambe le risposte sono corrette. Se si osserva la documentazione del collegamento npm, presenta entrambi i metodi, con questo approccio alla directory relativa come abbreviazione.
MJ,

1
Il secondo metodo (usando l' file:approccio) ha permesso alla mia app e al modulo locale di condividere una dipendenza. Il mio test ha npm linkprodotto una dipendenza duplicata, che interrompe le cose se la dipendenza deve essere utilizzata come singleton.
Daniel Waltrip,

Ho avuto un pacchetto locale (diciamo pacchetto1), pacchetto2 ha una dipendenza menzionata con relativo percorso di pacchetto1. npm non installo il pacchetto quando il percorso relativo inizia con "file: ../../pacchetto1", funzionante quando è '' ../../package1 ", aggiungere file all'inizio significa altro?
Dip686

17

npm pack + package.json

Questo è ciò che ha funzionato per me:

PASSAGGIO 1: in module project, eseguire npm pack:

Questo costruirà un <package-name>-<version>.tar.gzfile.

PASSAGGIO 2: spostare il file in consumer project

Idealmente puoi mettere tutti questi file in una tmpcartella nella tua consumer-projectradice:

PASSAGGIO 3: segnalalo nel tuo package.json:

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

PASSO 4: Installi pacchetti:

npm installoppure npm ioppureyarn

Ora, il tuo pacchetto sarebbe disponibile nella tua consumer-project's node_modulescartella.

In bocca al lupo...


10

Nessuno di questi approcci ( npm linko package.jsondipendenza dai file) funziona se il modulo locale ha dipendenze tra pari che si desidera installare solo nell'ambito del progetto.

Per esempio:

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

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

In questo scenario, gli insiemi NPM up myproject's node_modules/in questo modo:

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

Quando il nodo si carica mymodulee lo fa require('foo'), il nodo risolve il mymodulecollegamento simbolico e quindi cerca solo /local/mymodule/node_modules/(e i suoi antenati) foo, che non trova. Invece, vogliamo che il nodo guardi /local/myproject/node_modules/, dato che è da lì che stavamo eseguendo il nostro progetto e dove fooè installato.

Quindi, o abbiamo bisogno di un modo per dire al nodo di non risolvere questo link simbolico durante la ricerca foo, o abbiamo bisogno di un modo per dire a npm di installare una copia di mymodulequando viene utilizzata la sintassi della dipendenza file package.json. Purtroppo non ho trovato un modo di fare neanche :(


Ho trovato una soluzione alternativa, che è di impostare NODE_PATHper indicare node_modules/dove fooè installato. Quindi, per il caso precedente, sarebbe questo: NODE_PATH=/dev/myproject/node_modules/ che consente mymoduledi trovare foo.
Paul Medynski,

C'è una soluzione per. Inserire i moduli di dipendenza nella cartella principale del progetto . Definisci le tue dipendenze in package.json con il solito prefisso 'file:' . Do npm i Questo creerà un collegamento simbolico nei nodi_moduli del progetto e le sue dipendenze potrebbero essere sollevate nei nodi_moduli di livello superiore come farebbero per altri tipi di dipendenze. La mia versione di npm è v6.14.4. Dopo aver trascorso un paio d'ore su come risolvere questo problema, ho trovato questa soluzione qui: ( atmos.washington.edu/~nbren12/reports/journal/… ). Grazie nbren12.
sasebot,

Stavo avendo lo stesso problema. Ho trovato questa risposta: stackoverflow.com/questions/50807329/… , questo risolve il mio problema con dipendenze tra pari e librerie locali.
theawless

0

Manca la proprietà principale?

Come hanno risposto le persone precedenti npm --save ../location-of-your-packages-root-directory. Il ../location-of-your-packages-root-directorytuttavia deve avere due cose in ordine per farlo funzionare.

1) package.jsonin quella directory puntata verso

2) la mainproprietà in package.jsondeve essere impostata e funzionante ig "main": "src/index.js",se il file della voce ../location-of-your-packages-root-directoryè../location-of-your-packages-root-directory/src/index.js

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.