Perché dobbiamo installare gulp a livello globale e locale?


292

2 manuali su gulp dicono che devo installare gulp prima a livello globale (con -g flag) e poi ancora una volta localmente. Perché ne ho bisogno?


12
La pagina "Introduzione" del progetto dice la stessa cosa. (Inoltre non dice perché.)
TJ Crowder

11
Vorrei che npm potesse usare un pacchetto di dipendenze installato globalmente con la stessa versione del pacchetto locale. 5 MB di materiale glup per ogni directory di progetto: /
Ciantic,

@Ciantic Nessun garante, ma ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Risposte:


238

Quando si installa uno strumento a livello globale, deve essere utilizzato da un utente come utility da riga di comando ovunque, anche al di fuori dei progetti nodo. Le installazioni globali per un progetto nodo sono errate perché rendono più difficile la distribuzione.

npm 5.2+

L' npxutilità in bundle npm 5.2risolve questo problema. Con esso è possibile richiamare utilità installate localmente come utilità installate a livello globale (ma è necessario iniziare il comando con npx). Ad esempio, se si desidera invocare un'installazione locale eslint, è possibile eseguire:

npx eslint .

npm <5.2

Se utilizzato in un scriptcampo di package.json, npmcerca node_moduleslo strumento e i moduli installati a livello globale, quindi l'installazione locale è sufficiente.

Quindi, se sei soddisfatto (nel tuo package.json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

ecc. e funzionando con npm run testallora non dovresti aver bisogno dell'installazione globale.

Entrambi i metodi sono utili per configurare le persone con il tuo progetto poiché sudonon è necessario. Significa anche che gulpverrà aggiornato quando la versione viene archiviata in package.json, quindi tutti useranno la stessa versione di gulp durante lo sviluppo con il tuo progetto.

Addendum:

Sembra che gulp abbia un comportamento insolito quando usato a livello globale. Se utilizzato come installazione globale, gulp cerca un gulp installato localmente a cui passare il controllo. Pertanto un'installazione globale gulp richiede un'installazione locale gulp per funzionare. La risposta sopra è ancora valida. Le installazioni locali sono sempre preferibili alle installazioni globali.


3
Sì, ma cosa succede quando non si ha accesso a Internet? Come puoi usare gulp se non è installato a livello globale?
IGRACH,

3
@IGRACH Lo script sopra non utilizza una connessione Internet. Se vuoi fare la stessa cosa senza usare un campo di script in package.json, usa ./node_modules/.bin/gulp.
qubyte,

1
Ho definito gli alias per gulpe coffeequindi i comandi funzionano dalla radice del mio progetto nodo (ad es. alias gulp="node_modules/.bin/gulp"). In questo modo i comandi sono facili da usare se necessario e non si verificano conflitti di versione globale / locale.
Vesse

Grazie @qubyte! Penso che installarlo localmente sia una buona pratica in generale. Ho ancora una domanda, quindi spero che tu possa aiutarmi a chiarire la mia mente. Ho provato a installarlo a livello globale come suggerito dal documento di Gulp senza installarlo localmente. Quindi, quando provo a correre gulp, mi dà il seguente messaggio di errore Local gulp not found in .... Per quanto ho capito, dovrebbe prima guardare i nodi_moduli locali e se non lo trova dovrebbe guardare nei moduli installati a livello globale, non è vero? Grazie!
yeelan

1
Aggiunto un addendum. Speriamo che copra la stranezza del sorso.
qubyte

82

TLDR; Ecco perché :

Il motivo per cui funziona è perché gulptenta di eseguire il tuo gulpfile.jsutilizzo della versione installata localmente di gulp, vedi qui . Da qui il motivo di un'installazione globale e locale di gulp.

In sostanza, quando installi gulplocalmente lo script non è nel tuo PATHe quindi non puoi semplicemente digitare gulpe aspettarti che la shell trovi il comando. Installandolo a livello globale lo gulpscript entra nel tuo PATHperché la node/bin/directory globale è molto probabilmente sul tuo percorso.

Per rispettare le dipendenze locali, tuttavia, gulputilizzerà la versione installata localmente di se stesso per eseguire il gulpfile.js.


1
~ / bin è una convenzione Unix per i file binari per utente e in PATH per impostazione predefinita su molti sistemi operativi. gulp dovrebbe essere in grado di collegare il suo binario da lì.
Mikemaccana,

2
Detto in altre parole, il gulppacchetto installato a livello globale è necessario per mettere node_modules/.bin/gulpin percorso. Lo spazio di archiviazione è economico ma buttare via MB per simulare un symlink è pura sciatteria dell'IMO.
ntd

79

È possibile collegare a livello globale installato gulplocalmente con

npm link gulp

1
So che è meglio usare installazioni locali, ma potrebbero esserci casi in cui non riesci a installarlo o semplicemente non vuoi (immagina che il tuo server CI dedicato abbia gulp installato a livello globale e lo stai reinstallando ad ogni commit) . Comunque, +1 per citare npm link.
gion_13,

1
Vedo quello che hai fatto là. È intelligente.
deepelement

Questo non tenta di rispondere alla domanda
mikemaccana,

1
No, lo invalida e basta.
Berislav Lopac,

67

La domanda " Perché dobbiamo installare gulp a livello globale e locale? " Può essere suddivisa nelle due domande seguenti:

  1. Perché devo installare gulp localmente se l'ho già installato a livello globale?

  2. Perché devo installare gulp a livello globale se l'ho già installato localmente?

Molti altri hanno fornito risposte eccellenti a queste domande in modo isolato, ma ho pensato che sarebbe stato utile consolidare le informazioni in una risposta unificata.

Perché devo installare gulp localmente se l'ho già installato a livello globale?

La logica per l'installazione di gulp localmente comprende diversi motivi:

  1. Includere le dipendenze del progetto a livello locale garantisce che la versione di gulp (o altre dipendenze) utilizzata sia la versione originariamente prevista.
  2. Node non considera i moduli globali per impostazione predefinita quando si utilizza require () (che è necessario includere gulp nello script). In definitiva, ciò è dovuto al fatto che il percorso dei moduli globali non viene aggiunto a NODE_PATH per impostazione predefinita.
  3. Secondo il team di sviluppo del nodo, i moduli locali si caricano più velocemente. Non posso dire perché questo sia, ma questo sembrerebbe essere più rilevante per l'uso del nodo nella produzione (cioè dipendenze di runtime) che nello sviluppo (cioè dipendenze di sviluppo). Suppongo che questo sia un motivo legittimo in quanto ad alcuni potrebbe interessare qualunque vantaggio di velocità minore si ottenga caricando moduli locali rispetto a quelli globali, ma non esitate a sollevare il sopracciglio per questo motivo.

Perché devo installare gulp a livello globale se l'ho già installato localmente?

  1. La logica per l'installazione di gulp a livello globale è in realtà solo la comodità di trovare automaticamente l'eseguibile gulp nel percorso del sistema.

Per evitare l'installazione a livello locale è possibile utilizzare npm link [package], ma il comando di collegamento e il install --globalcomando non sembrano supportare l' --save-devopzione, il che significa che non sembra esserci un modo semplice per installare gulp a livello globale e quindi aggiungere facilmente qualunque versione sia il tuo file package.json locale.

In definitiva, credo che abbia più senso avere la possibilità di utilizzare moduli globali per evitare di duplicare l'installazione di strumenti comuni su tutti i tuoi progetti, specialmente nel caso di strumenti di sviluppo come grunt, gulp, jshint, ecc. Purtroppo sembra che finisci per combattere un po 'gli strumenti quando vai contro il grano.


7
+1 per essere la prima persona su Internet a sottolineare che ci sono due punti alla domanda. Quasi tutti ovunque rispondono "Perché devo installare gulp a livello globale se l'ho già installato localmente?" quando quello che volevo sapere era "Perché devo installare gulp localmente se l'ho già installato a livello globale?".
Nathan JB,

10
Il fatto che questa domanda abbia bisogno di una spiegazione così elaborata significa che questo semplicemente non è un modo molto logico di lavorare. Installare lo stesso strumento più volte per ogni progetto non dovrebbe essere necessario.
Kokodoko,

4
La tua risposta è così bella, senza emozioni. Il mio avrebbe avuto l'80% di parolacce, dato che questo sembra essere così stupido. Dal punto di vista degli strumenti, la teoria dell'installazione locale è probabilmente giusta, ma dal punto di vista del sistema operativo e dal punto di vista dei gestori di pacchetti questo è così folle che non riesco a trovare parole per questo. Quali farmaci assumono i ragazzi NPM / gulp?!? Se qualcuno non è d'accordo, leggi come gestore dei pacchetti di sistema come dpkg, yum, pacman e co. lavoro.
JepZ,

2
@JepZ è solo un sorso essere super strano però, non c'è nulla nel nodo o npm che lo costringe. E mantenere versioni specifiche di gulp nel progetto ha senso solo se i ragazzi di gulp interrompono le versioni di patch su base regolare o qualcosa del genere, altri strumenti di build sono di solito un'installazione globale. Ma ah bene. Proprio qui per il giuramento.
Stoffe

2
È davvero un non-problema ora poiché la comunità è passata ad usare solo il filo :)
Derek Greer,

8

Tecnicamente non è necessario installarlo a livello globale se la node_modulescartella nell'installazione locale è nella propria PATH. Generalmente questa non è una buona idea.

In alternativa se si fa npm testriferimento gulpallora puoi semplicemente digitare npm teste verrà eseguito il gulp locale.

Non ho mai installato gulp a livello globale - penso che sia una cattiva forma.


3
Un approccio migliore rispetto a metterlo nel tuo percorso è utilizzare gli script NPM
Jay

2

Non sono sicuro che il nostro problema fosse direttamente correlato all'installazione di gulp solo localmente. Ma abbiamo dovuto installare noi stessi un sacco di dipendenze. Ciò ha portato a un "enorme" package.json e non siamo sicuri che sia davvero un'ottima idea installare gulp solo localmente. Abbiamo dovuto farlo a causa del nostro ambiente di costruzione. Ma non consiglierei l'installazione di gulp non a livello globale se non è assolutamente necessario. Abbiamo riscontrato problemi simili come descritto nel seguente post sul blog

Nessuno di questi problemi sorge per nessuno dei nostri sviluppatori sui loro computer locali perché tutti hanno installato gulp a livello globale. Sul sistema di build abbiamo riscontrato i problemi descritti. Se qualcuno è interessato, potrei approfondire questo problema. Ma in questo momento volevo solo menzionare che non è un percorso facile per installare gulp solo localmente.


Sì, per favore, approfondisci questo problema.
Kenorb,

1

Solo perché non l'ho visto qui, se sei su MacOS o Linux, ti suggerisco di aggiungere questo al tuo PERCORSO (nella tua base ecc.):

node_modules/.bin

Con questa voce relativa del percorso, se ci si trova nella cartella principale di qualsiasi progetto nodo, è possibile eseguire qualsiasi strumento da riga di comando (eslint, gulp, ecc. Ecc.) Senza preoccuparsi di "installazioni globali" o npm runecc.

Una volta fatto questo, non ho mai installato un modulo a livello globale.

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.