come specificare i moduli locali come dipendenze del pacchetto npm


269

Ho un'applicazione che ha la solita serie di dipendenze da moduli di terze parti (ad esempio 'express') specificate nel file package.json sotto dipendenze. Per esempio

"express"     : "3.1.1"

Vorrei strutturare il mio codice in modo modulare e fare in modo che package.json installi un set di moduli locali (ovvero sul file system in cui mi trovo attualmente). So che posso installare un modulo locale eseguendo:

npm install path/to/mymodule

Tuttavia, non so come farlo accadere tramite la struttura delle dipendenze package.json. L'uso --savedell'opzione in questo comando è semplicemente quello di inserire il "mymodule": "0.0.0"mio pacchetto.json (non fa riferimento alla posizione del percorso del file). Se poi rimuovo la versione installata da node_modules e provo a reinstallare da package.json, fallisce (perché cerca "mymodule" nel registro centrale e non cerca localmente).

Sono sicuro che è un modo per dire alla "dependencies": {}struttura che voglio che sia installato da un percorso del file system, ma non so come.

Qualcun altro ha avuto questo problema? Grazie.


1
Un'ottima domanda. Triste nel rendersi conto che non esiste una funzione equivalente package.jsona ciò che abbiamo in Gemfiles.
Jarl,

3
possibile duplicato della dipendenza locale in package.json
Kelly,

Risposte:


408

npm install ora supporta questo

npm install --save ../path/to/mymodule

Perché questo funzioni mymoduledeve essere configurato come un modulo con il proprio package.json. Vedi Creazione di moduli NodeJS .

A partire da npm 2.0, le dipendenze locali sono supportate in modo nativo. Vedi la risposta di danilopopeye a una domanda simile . Ho copiato la sua risposta qui poiché questa domanda è molto alta nei risultati di ricerca web.

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

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

È valido anche uno dei seguenti percorsi:

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

sincronizzazione degli aggiornamenti

Dal momento che le npm installcopie mymodulein node_modules, le modifiche nella mymodulefonte non verranno automaticamente visualizzate dal progetto dipendente.

Esistono due modi per aggiornare il progetto dipendente con

  • Aggiorna la versione di mymodulee poi usanpm update : Come puoi vedere sopra, la package.jsonvoce "dipendenze" non include un identificatore di versione come vedresti per le dipendenze normali. Invece, per le dipendenze locali, npm updatecerca solo di assicurarti che sia installata l' ultima versione, come determinato da mymodule's package.json. Vedi la risposta di chriskelly a questo problema specifico .

  • Reinstalla utilizzando npm install. Questo installerà qualunque sia mymoduleil percorso del sorgente, anche se è più vecchio, o ha un ramo alternativo estratto, qualunque cosa.


2
Questo ha funzionato per me. (Ho appena fatto un percorso relativo locale come"mymodule":"file:mymoduledir"
Don Rhummy,

72
npm install --save ../my-local-repo
Ivan Rave,

15
E come usarlo nel progetto? Sto provando a chiamarlo come import { HelloWorld } from "my-test-lib";, ma ricevo l'errore "Impossibile trovare il modulo". Si prega, dare un'occhiata a stackoverflow.com/questions/46818083/...
Vitalii Vasylenko

6
@LucioMollinedo puoi condividere la sintassi di come hai importato il modulo locale? Come per Vitallii, visualizzo l'errore "Can't fine module" conimport { HelloWorld } from "my-test-lib";
Stan James il

7
Questo non funziona come fare riferimento a un pacchetto in quanto le dipendenze non verranno installate nel progetto
Glass Cannon


11

local_modulesAlla fine non sono riuscito a trovare un modo pulito, quindi sono andato a creare una directory chiamata e quindi ho aggiunto questo bashscript a package.json in script-> preinstall

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

Dopo aver faticato molto con il npm linkcomando (soluzione suggerita per lo sviluppo di moduli locali senza pubblicarli in un registro o mantenere una copia separata nella cartella node_modules), ho creato un piccolo modulo npm per risolvere questo problema.

La correzione richiede due semplici passaggi .

Primo:

npm install lib-manager --save-dev

In secondo luogo, aggiungi questo al tuo package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Maggiori dettagli su https://www.npmjs.com/package/lib-manager . Spero che aiuti qualcuno.


0

Se è accettabile pubblicare semplicemente i tuoi moduli preinstallati in node_modules insieme agli altri tuoi file, puoi farlo in questo modo:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Potresti anche voler archiviare il tuo modulo su git e dire al tuo genitore package.json di installare la dipendenza da git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
Sfortunatamente ciò implicherebbe node_modules con i miei moduli locali e moduli di terze parti / forniti installati dal registro (ad es. Connect) nella stessa directory. Oltre a essere confuso dal punto di vista Git / VCS (cioè dovrebbe ignorare tutto in node_modules tranne quelli che ho creato), è anche una cattiva pratica (quelli che ho scritto e non sono pubblicati dovrebbero essere tenuti separati da quelli che altri hanno scritto e pubblicato ).
Sam Adams,

Quando aggiungo un modulo locale, apporto le modifiche che non vengono visualizzate dalla mia app principale. Perché è così?
Mark Tyers,
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.