La cartella “node_modules” dovrebbe essere inclusa nel repository git


Risposte:


177

La risposta non è facile come suggerisce Alberto Zaccagni. Se sviluppi applicazioni (in particolare applicazioni enterprise), inclusi node_modules nel tuo repository git è una scelta praticabile e quale alternativa scegli dipende dal tuo progetto.

Poiché ha discusso molto bene contro node_modules, mi concentrerò sugli argomenti per loro.

Immagina di aver appena finito un'app aziendale e dovrai supportarla per 3-5 anni. Sicuramente non vuoi dipendere dal modulo npm di qualcuno che domani potrebbe scomparire e non puoi più aggiornare la tua app.

Oppure hai i tuoi moduli privati ​​che non sono accessibili da Internet e non puoi costruire la tua app su Internet. O forse non vuoi dipendere dal tuo build finale sul servizio npm per alcuni motivi.

Puoi trovare pro e contro in questo articolo di Addy Osmani (anche se si tratta di Bower, è quasi la stessa situazione). E finirò con una citazione dalla homepage di Bower e dall'articolo di Addy:

"Se non stai creando un pacchetto destinato ad essere utilizzato da altri (ad esempio, stai creando un'app Web), dovresti sempre controllare i pacchetti installati nel controllo del codice sorgente."


6
Sono completamente d'accordo. Non voglio che il nostro sistema di compilazione aziendale richieda una connessione Internet per realizzare una build di successo perché deve scaricare dipendenze, che si spera siano ancora disponibili. Grazie.
cane mortale

9
@Alberto Zaccagni Credo che tu abbia avuto ragione la prima volta. Se stai davvero costruendo un'app aziendale, allora dovresti utilizzare gli strumenti aziendali. Artifactory e npm-artifactory dovrebbero essere usati per proteggere da progetti che scompaiono da Internet. Anche su piccoli progetti è più pulito che avere diverse copie della stessa cosa controllate nel controllo del codice sorgente.
Ted Bigham,

10
Dopo il problema con il pad sinistro , penso che non sia sicuramente una cattiva idea tracciare node_modules.
Léo Lam,

6
Aspetto importante nessuno menzionato. Se i tuoi node_modules sono sotto VCS - cambiare ramo è giusto git checkout foo. Se node_modules non è in VCS - lo scambio di rami è git checkout foo ; npm installe qualunque cosa la tua attuale versione di NPM richiede per funzionare;)
Ivan Kleshnin

7
La soluzione aziendale più pulita sarebbe quella di ospitare un repository npm interno accessibile dall'Intranet che abbia tutte le versioni dei moduli che usi, e non fare il check in node_modules con il codice sorgente. Il sistema di compilazione farebbe riferimento al repository del nodo interno.
user2867288

104

I dettagli dei moduli sono memorizzati packages.json, questo è sufficiente. Non è necessario effettuare il check-in node_modules.

Le persone erano solite archiviare il node_modulescontrollo versione per bloccare le dipendenze dei moduli, ma con npm shrinkwrap non è più necessario.

Un'altra giustificazione per questo punto, come ha scritto @ChrisCM nel commento:

Inoltre, vale la pena notare che tutti i moduli che coinvolgono estensioni native non funzionano da architettura a architettura e devono essere ricostruiti. Fornire una giustificazione concreta per NON includerli nel repository.


10
Semplice e al punto +1. Inoltre, vale la pena notare che tutti i moduli che coinvolgono estensioni native non funzionano da architettura a architettura e devono essere ricostruiti. Fornire una giustificazione concreta per NON includerli nel repository.
ChrisCM,

3
Non proprio, questa è la giustificazione per l'utilizzo di un ambiente di sviluppo riproducibile usando ad esempio il vagabondo. Dovrebbe funzionare solo su un'architettura.
Robin Smith,

20

Vorrei raccomandare di non archiviare node_modules a causa di pacchetti come PhantomJS e node-sass, ad esempio, che installano il binario appropriato per il sistema attuale.

Ciò significa che se un Dev viene eseguito npm installsu Linux e verifica in node_modules, non funzionerà per un altro Dev che clona il repository su Windows.

È meglio controllare nei tarball quali npm installano i download e puntarli npm-shrinkwrap.json. Puoi automatizzare questo processo usando shrinkpack .


Ma non ha npm install --global shrinkpackquindi la debolezza differita, richiedendo altri pacchetti con cui installare i pacchetti rimpiccioliti? Questo va contro il consiglio di Addy.
danja

potresti riformulare la domanda per favore @danjah? Non capisco perfettamente che ti dispiaccia.
Jamie Mason,

Da quanto descritto, shrinkpackè necessaria la dipendenza per installare in modo affidabile le dipendenze di build. Pertanto, l'installazione dello strumento di creazione stesso diventa il punto debole dell'argomento contro l'invio di tutte le dipendenze di build al controllo di versione.
danja

1
Penso che il check-in nei file di blocco sia sufficiente (package-lock.json; yarn.lock) almeno secondo TFM: docs.npmjs.com/files/package-lock.json
aimass

1
si otterrebbe un grafico delle dipendenze prevedibile quando si utilizza un file di blocco e non si è sensibili ai problemi discussi su PhantomJS e node-sass ecc. su piattaforme diverse. Avresti bisogno di una connessione a Internet e, ovviamente, il registro dovrebbe essere attivo.
Jamie Mason,

7

Questo argomento è piuttosto vecchio, vedo. Ma mi manca qualche aggiornamento agli argomenti forniti qui a causa della mutata situazione nell'ecosistema di npm.

Consiglio sempre di non mettere node_modules sotto controllo di versione. Quasi tutti i benefici derivanti dal farlo, elencati nel contesto della risposta accettata, sono piuttosto obsoleti al momento.

  1. I pacchetti pubblicati non possono più essere facilmente revocati dal registro npm. Quindi non devi temere di perdere dipendenze su cui il tuo progetto ha fatto affidamento prima.

  2. Mettere il file package-json.lock in VCS aiuta con le dipendenze frequentemente aggiornate che probabilmente portano a diverse configurazioni facendo affidamento sullo stesso file package.json.

Pertanto, l'inserimento di node_modules in VCS in caso di strumenti di compilazione offline potrebbe essere considerato l'unico caso d'uso idoneo rimasto. Tuttavia, node_modules di solito cresce abbastanza velocemente. Qualsiasi aggiornamento cambierà molti file. E questo sta influenzando i repository in diversi modi. Se consideri davvero gli effetti a lungo termine, questo potrebbe essere anche un impedimento.

VCS centralizzato come svn richiede il trasferimento di file di commit e di checkout sulla rete, che sarà lento come l'inferno quando si tratta di estrarre o aggiornare una cartella node_modules.

Quando si tratta di git questo elevato numero di file aggiuntivi inquinerà immediatamente il repository. Tieni presente che git non sta monitorando le differenze tra le versioni di qualsiasi file, ma sta memorizzando copie di entrambe le versioni di un file non appena un singolo carattere è cambiato. Ogni aggiornamento a qualsiasi dipendenza si tradurrà in un altro grosso changeset. Il tuo repository git diventerà rapidamente enorme a causa di ciò che influisce sui backup e sulla sincronizzazione remota. Se decidi di rimuovere node_modules dal repository git in un secondo momento, sarà ancora parte di esso per motivi storici. Se hai distribuito il tuo repository git su un server remoto (ad es. Per il backup), pulirlo è un'altra attività dolorosa e soggetta a errori in cui ti imbatteresti.

Pertanto, se ti interessano processi efficienti e ti piace mantenere le cose "piccole", preferirei utilizzare un repository di artefatti separato come Nexos Repository (o solo un server HTTP con archivi ZIP) che fornisce alcune serie di dipendenze precedentemente scaricate per il download.


6

Non tracciare node_modulescon il controllo del codice sorgente è la scelta giusta perché alcuni moduli NodeJS, come il driver MongoDB NodeJS, utilizzano i componenti aggiuntivi NodeJS C ++. Questi componenti aggiuntivi vengono compilati durante l'esecuzione del npm installcomando. Pertanto, quando si tiene traccia della node_modulesdirectory, è possibile eseguire il commit accidentale di un file binario specifico del sistema operativo.


3

Sono d'accordo con ivoszz che a volte è utile controllare la cartella node_modules, ma ...


scenario 1:

Uno scenario: usi un pacchetto che viene rimosso da npm. Se hai tutti i moduli nella cartella node_modules, non sarà un problema per te. Se hai solo il nome del pacchetto in package.json, non puoi più ottenerlo. Se un pacchetto ha meno di 24 ore, è possibile rimuoverlo facilmente da npm. Se ha più di 24 ore, è necessario contattarli. Ma:

Se contatta l'assistenza, controlleranno se la rimozione di quella versione del pacchetto interromperà qualsiasi altra installazione. In tal caso, non lo rimuoveremo.

leggi di più

Quindi le possibilità per questo sono basse, ma c'è lo scenario 2 ...


scenario 2:

Un altro scenario in cui questo è il caso: sviluppi una versione aziendale del tuo software o un software molto importante e scrivi nel tuo package.json:

"dependencies": {
    "studpid-package": "~1.0.1"
}

Si utilizza il metodo function1(x) di quel pacchetto.

Ora gli sviluppatori di studpid-pacchetto di rinominare il metodo function1(x)di function2(x)e fanno un guasto ... Cambiano la versione del loro pacchetto da 1.0.1a 1.1.0. Questo è un problema perché quando chiami npm installla prossima volta, accetti la versione 1.1.0perché hai usato la tilde ("studpid-package": "~1.0.1" ).

La chiamata function1(x)può causare errori e problemi ora.


Ma:

Il push dell'intera cartella node_modules (spesso più di 100 MB) nel repository, ti costerà spazio di memoria. Pochi kb (solo package.json) rispetto a centinaia di MB (package.json e node_modules) ... Pensaci.

Potresti farlo / dovresti pensarci se:

  • il software è molto importante.

  • ti costa denaro quando qualcosa fallisce.

  • non ti fidi del registro npm. npm è centralizzato e potrebbe teoricamente essere chiuso.

Non è necessario pubblicare la cartella node_modules nel 99,9% dei casi se:

  • sviluppi un software solo per te stesso.

  • hai programmato qualcosa e vuoi solo pubblicare il risultato su GitHub perché qualcun altro potrebbe essere interessato a questo.


Se non si desidera che node_modules si trovi nel proprio repository, è sufficiente creare un .gitignorefile e aggiungere la riga node_modules.


1
Un altro svantaggio della "pubblicazione della cartella node_modules" potrebbe essere: Chiamare npm installsu Windows e MacOS potrebbe generare file diversi (file dipendenti dal sistema operativo) in alcuni pacchetti. Ma non ne sono sicuro. Qualcuno può verificare che questo sia vero?
ndsvw,

2
"scenario 2": ecco perché ti impegni package-lock.json. Se in futuro c'è un problema con un aggiornamento di studpid-package, puoi ripristinare il file di blocco per scoprire la versione esatta che ha funzionato per te.
ToolmakerSteve

2

Vorrei offrire una via di mezzo alternativa.

  1. Non aggiungere node_modules in Git.
  2. Usare un package-lock.json file per inchiodare le versioni di dipendenza.
  3. Nel tuo CI o processo di rilascio, quando rilasci una versione crea una copia della cartella node_modules ed esegui il backup (ad es. Nel cloud storage).

Nel raro caso in cui non sia possibile accedere a NPM (o ad altri registri utilizzati) o a un pacchetto specifico in NPM, si dispone di una copia di node_modules e si può continuare a lavorare fino al ripristino dell'accesso.


0

Un'altra cosa da considerare: il check-in node_modulesrende più difficile / impossibile usare la differenza tra dependenciese devDependencies.

D'altra parte, si potrebbe dire che è rassicurante spingere alla produzione lo stesso identico codice che ha superato i test, quindi anche devDependencies.


"per produrre lo stesso identico codice che ha superato i test": questo è ciò per cui hai Docker. O un gestore di pacchetti os, come rpm. Non ricostruisci il codice tra test e prod, vero? devDependencies ha aiutato a costruire il codice finale, ma non ha spazio in una distribuzione, né in test né in prod.
Per Wiklander,

Sarebbe d'aiuto se le devDependencies fossero nel loro pacchetto.json una directory più alta della directory "src"? Poiché i moduli del nodo vengono cercati iniziando nella directory corrente e poi spostandosi verso l'alto, dovresti comunque usare le tue dipendenze dev e avere la separazione dei moduli dev / src.
Alex,

0

node_modules non deve essere archiviato se le dipendenze sono menzionate in package.json. Qualsiasi altro programmatore può semplicemente ottenerlo eseguendo npm install e npm è abbastanza intelligente da rendere node_modules nella directory di lavoro per il progetto.

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.