2014-09-17 11 views
22

Uso Node.js (tramite browserify) per ognuna delle mie app Web, tutte con alcune dipendenze comuni e altre specifiche per loro. Ognuna di queste app ha un file package.json che specifica quali versioni di quali moduli ha bisogno.Come funziona l'installazione di npm

In questo momento, ho una directory /node_modules nella cartella principale delle mie app per i moduli a cui tutti devono fare riferimento e quindi inserisco i moduli specifici delle app in una cartella node_modules nella directory dell'app. Questo funziona bene a breve termine, dal momento che le mie istruzioni require() sono in grado di continuare a guardare verso l'alto nella struttura dei file finché non trovano la directory node_modules con l'app corretta.

Quando questo diventa complicato è quando voglio tornare a un vecchio progetto ed eseguire npm install per assicurarsi che possa ancora trovare tutte le dipendenze di cui ha bisogno. (Chissà cosa divertente-business si è verificato da allora a livello di directory superiore.) Ho avuto l'impressione che npm install fatto questo:

  • per ogni modulo elencato nella package.json, prima verifica se è presente, salendo la directory allo stesso modo require fa. In caso contrario, installarlo nella directory locale node_modules (creando tale directory se necessario).

Quando eseguo npm install all'interno di una cartella di app, tuttavia, sembra installare tutto localmente indipendentemente da dove altro possa esistere a monte. È questo il comportamento corretto? (È possibile che ci sia un altro motivo, come il linguaggio di versione errato nel mio package.json). Se questo è il comportamento corretto, c'è un modo per me di avere npm install comportarsi come sopra?

Non è un grosso problema replicare ampiamente i moduli all'interno di ogni app, ma ci si sente in disordine e mi impedisce di apportare piccoli miglioramenti ai moduli comuni e di non dover aggiornare tutti i vecchi file package.json. Naturalmente, questa potrebbe essere una buona cosa ...

+0

Ecco il link.Per favore, passate a questo link. Questo potrebbe esserti utile. [https://www.npmjs.org/doc/cli/npm-shrinkwrap.html](https://www.npmjs.org/doc/cli/npm-shrinkwrap.html) –

risposta

16

Quando eseguo l'installazione di npm all'interno di una cartella di app, tuttavia, sembra installare tutto localmente, indipendentemente da dove possa esistere a monte. È questo il comportamento corretto? (È possibile che ci sia un altro motivo, come il brutto linguaggio di versione nel mio package.json). Se questo è il comportamento corretto, c'è un modo per me di fare installare npm come sopra?

Sì, questo è l'installazione di npm. Nel codice node.js, l'algoritmo require ha una particolare sequenza di posizioni, compresa la risalita del filesystem. Tuttavia, npm install non lo fa. Si installa solo sul posto. Gli algoritmi che utilizza sono tutti vincolati a una singola directory node_modules nella directory corrente e non toccherà nulla al di sopra di quello (tranne che con -g).

Non è un grosso problema replicare ampiamente i moduli all'interno di ogni app, ma ci si sente disordinati e mi impedisce di apportare piccoli miglioramenti ai moduli comuni e di non dover aggiornare ogni vecchio file package.json. Naturalmente, questa potrebbe essere una buona cosa ...

Sì, fondamentalmente lo stai facendo male. Il flusso di lavoro regolare si adatta bene a Internet. Per il tuo caso d'uso crea un lavoro noioso extra, ma puoi anche usare semplicemente il versioning semantico come previsto e specificare "mylib": "^1.0.0" nel tuo pacchetto.json per le tue app e stai bene con l'ottenimento automatico delle nuove versioni la prossima volta che hai npm install.

+1

Proprio quello che dovevo sapere. Grazie! –

+1

Mi sento un po 'più di informazioni su cosa^1.0.0 sarebbe stato fantastico per le persone che vengono a questa domanda quando si cerca su google per aiuto su npm. –

+0

Come ha detto @AlejoBrz, se qualcuno vuole maggiori informazioni sul controllo delle versioni, visitare https://docs.npmjs.com/getting-started/semantic-versioning –