Come posso fare in modo che più progetti condividano la directory node_modules?


95

Ogni volta che realizzo progetti, devo scaricare tutte le dipendenze dei moduli del nodo. Senza copiare i node_modules, c'è comunque da condividere i node_modules centrali in più progetti?

come i seguenti, devo eseguire molti comandi ogni volta ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
Puoi installarli in una directory genitore comune, se ce n'è una. Node risalirà le directory cercando il requiremodulo d. Altrimenti no, non esiste una node_modulescartella "centrale" ufficiale da utilizzare con require().
Jonathan Lonowski

È possibile installare globalmente questi pacchetti utilizzando il flag globale. Quindi non è necessario eseguire i comandi di installazione ogni volta. npm install <npm_package_name> -g
Saba Hassan

Risposte:


90

Puoi assolutamente condividere una directory node_modules tra i progetti.

Dalla documentazione di node :

Se l'identificativo del modulo passato a require () non è un modulo nativo e non inizia con "/", "../" o "./", il nodo inizia dalla directory padre del modulo corrente e aggiunge / node_modules e tenta di caricare il modulo da quella posizione.

Se non viene trovato lì, si sposta nella directory padre e così via, fino a raggiungere la radice del file system.

Ad esempio, se il file in '/home/ry/projects/foo.js' chiamato require ('bar.js'), il nodo cercherà nelle seguenti posizioni, in questo ordine:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Quindi metti una cartella node_modules nella directory dei tuoi progetti e inserisci i moduli che desideri. Basta richiederli come al solito. Quando node non trova una directory node_modules nella cartella del progetto, controllerà automaticamente la cartella principale. Quindi crea la struttura della tua directory in questo modo:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Quindi, in questo modo, anche le dipendenze del tuo sottoprogetto possono disegnare sul tuo repository principale node_modules.

Uno svantaggio di farlo in questo modo è che dovrai compilare manualmente il tuo file package.json (a meno che qualcuno non conosca un modo per automatizzarlo con grugnito o qualcosa del genere). Quando installi i tuoi pacchetti e aggiungi --save arg a un npm installcomando, lo aggiunge automaticamente alla sezione delle dipendenze o al tuo package.json, il che è conveniente.


3
Perché questo non è accettato come risposta op? Ulteriore domanda a @tpie, se si dovesse strutturare un progetto come tu hai suggerito, come costruire il package.json da installare dal repository del modulo genitore.
diehell

@diehell Quindi sembra che sia "tutto o niente". Se tutte le dipendenze o risiedono in una directory padre e non è presente alcuna directory node_modules in CWD, npm controllerà il genitore e installerà lì se lo trova. Se metti una cartella node_modules nella directory, verrà installata lì.
tpie

4
Non vedo come la condivisione di node_modules possa gestire diverse versioni di pacchetti, i pacchetti in node_modules non sono dotati di versione, a differenza di npm-cache in c: \ users (Windows), qualcuno si è imbattuto in quello?
cyberguest

Come modifico il mio paradigma durante la scrittura di script npm e file package.json?
Maddocks

18

Ho trovato un trucco, dai un'occhiata ai collegamenti simbolici (collegamenti simbolici) su Windows o Linux , funziona proprio come le scorciatoie ma più potente.

Devi semplicemente creare una cartella Junctionper la tua node_modulescartella ovunque tu voglia. La giunzione non è altro che una scorciatoia per la tua cartella node_modules originale. Crealo all'interno della cartella del progetto in cui sarebbero stati creati i node_modules effettivi se utilizzati npm install.

Per ottenere ciò è necessaria almeno una node_modulescartella reale, quindi crearne una giunzione negli altri progetti.

Su Windows, puoi utilizzare il prompt dei comandi o utilizzare un'applicazione. L'uso del prompt dei comandi ti dà un po 'più di controllo, l'uso di un'applicazione è più facile, suggerisco Link Shell Extension .


1
I cd per dir di destinazione, eseguire questo comando: mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Il mio team utilizza questo metodo da un po 'di tempo. Anche se disprezzo davvero di non averlo node_modulesnella cartella del progetto stesso, funziona. Devo solo ricordarmi di passare alla node_modulescartella effettiva prima di installare qualcosa di nuovo: P
Andrew Craswell

Questo metodo non sembra funzionare per me. Quando utilizzo simbolici o giunzioni, ottengo il seguente errore con node-sass: Build del modulo non riuscita: "Errore: il modulo non si è registrato automaticamente" e l'errore ha ulteriori dettagli che specificano la directory in cui esiste la directory node_modules "condivisa". Qualche idea?
Flipcode

1
Come evitare l'eliminazione delle dipendenze durante l'esecuzione npm installin una delle app "connesse"?
Qwerty

1
ma quando eseguo npm install <new-package>tutti i pacchetti non presenti nel package.json del tuo progetto corrente vengono rimossi.
Rohit Kaushal

17

Prova pnpm invece di npm.

pnpm usa collegamenti fisici e collegamenti simbolici per salvare una versione di un modulo solo una volta su un disco.

Installa con:

npm install -g pnpm

Per aggiornare le installazioni esistenti (e le sottodirectory) utilizzare:

pnpm recursive install

8

La directory principale dovrebbe essere simile a questa

node_modules
Project 1
Project 2
Project 3
Project 4

basta aprire il file Project 1/.angular-cli.json

modificare lo schema

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

per

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

e non dimenticare di creare node_modulesuna cartella vuota all'interno della directory del tuo progetto


Tu sei il mio eroe. Ci ho passato una settimana . Grazie mille!!
Eliezer Berlin

5

Guardando alcuni articoli sembra che Lerna sia un ottimo strumento per gestire più progetti all'interno di una singola directory ( monorepo). Supporta la condivisione dei moduli senza duplicare gli interi pacchetti in ogni cartella e comandi per installarli in più progetti.

pnpm è anche uno strumento semplice ed efficiente, che non duplica quei moduli che sono già installati per altri progetti.


0

Supponiamo che avendo un singolo node_modules dovrebbe contenere tutti i pacchetti per tutte le applicazioni. quindi le tue app condivideranno anche la maggior parte delle voci package.json uniche (solo il nome dovrebbe cambiare)

la mia idea sarebbe quella di avere una singola radice e più livelli src come di seguito

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

l'unico problema che potresti incontrare sarebbe avere un backup di json (o tsconfig) per qualsiasi app e ripristinarli quando ci lavori o configurare i tuoi script di avvio per servire qualsiasi app


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.