Pourquoi devons-nous installer gulp à l'échelle mondiale et locale?

292

2 manuels sur gulp disent que je dois installer gulp d'abord globalement (avec le drapeau -g) puis une fois de plus localement. Pourquoi ai-je besoin de ça?

Stepan Suvorov
la source
12
La page "Mise en route" du projet dit la même chose. (Ne dit pas non plus pourquoi.)
TJ Crowder
11
Je souhaite que npm puisse utiliser globalement un package de dépendances qui est la même version que le package local. 5 Mo de trucs glup pour chaque répertoire de projet: /
Ciantic
@Ciantic Pas de garantie, mais ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Réponses:

238

Lors de l'installation d'un outil à l'échelle mondiale, il doit être utilisé par un utilisateur comme utilitaire de ligne de commande n'importe où, y compris en dehors des projets de noeud. Les installations globales pour un projet de nœud sont mauvaises car elles rendent le déploiement plus difficile.

npm 5.2+

L' npxutilitaire fourni avec npm 5.2résout ce problème. Avec lui, vous pouvez invoquer des utilitaires installés localement comme des utilitaires installés globalement (mais vous devez commencer la commande par npx). Par exemple, si vous souhaitez appeler un installé localement eslint, vous pouvez faire:

npx eslint .

npm <5,2

Lorsqu'il est utilisé dans un scriptchamp de votre package.json, npmrecherche node_modulesl'outil ainsi que les modules installés globalement, donc l'installation locale est suffisante.

Donc, si vous êtes satisfait (dans votre package.json):

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

etc. et en cours d'exécution, npm run testvous ne devriez pas du tout avoir besoin de l'installation globale.

Les deux méthodes sont utiles pour mettre en place des personnes avec votre projet car elles sudone sont pas nécessaires. Cela signifie également que gulpcela sera mis à jour lorsque la version sera remplacée dans le package.json, donc tout le monde utilisera la même version de gulp lors du développement avec votre projet.

Addenda:

Il semble que gulp ait un comportement inhabituel lorsqu'il est utilisé à l'échelle mondiale. Lorsqu'il est utilisé en tant qu'installation globale, gulp recherche un gulp installé localement pour passer le contrôle. Par conséquent, une installation globale de gulp nécessite une installation locale de gulp pour fonctionner. La réponse ci-dessus est toujours valable. Les installations locales sont toujours préférables aux installations globales.

qubyte
la source
3
Oui mais que faire si vous n'avez pas accès à Internet? Comment pouvez-vous utiliser gulp s'il n'est pas installé globalement?
IGRACH
3
@IGRACH Le script ci-dessus n'utilise pas de connexion Internet. Si vous souhaitez faire la même chose sans utiliser de champ de script dans package.json, utilisez ./node_modules/.bin/gulp.
qubyte
1
J'ai défini des alias pour gulpet coffeedonc les commandes fonctionnent à partir de la racine de mon projet de nœud (par exemple. alias gulp="node_modules/.bin/gulp"). De cette façon, les commandes sont faciles à utiliser si nécessaire et les conflits de version globale / locale ne se produisent pas.
vesse
Merci @qubyte! Je pense que l'installer localement est une bonne pratique en général. J'ai encore une question, alors j'espère que vous pourrez m'aider à me vider l'esprit. J'ai essayé de l'installer globalement comme le suggère le document de Gulp sans l'installer localement. Ainsi, lorsque j'essaie de courir gulp, cela me donne le message d'erreur suivant Local gulp not found in .... Pour autant que je sache, il devrait d'abord examiner les modules_noeud locaux et s'il n'est pas trouvé, il devrait ensuite examiner les modules installés à l'échelle mondiale, n'est-ce pas? Merci!
yeelan
1
Ajout d'un addendum. Espérons que cela couvre l'étrangeté de la gorgée.
qubyte
82

TLDR; Voici pourquoi :

La raison pour laquelle cela fonctionne est parce que gulptente d'exécuter votre en gulpfile.jsutilisant votre version installée localement de gulp, voir ici . D'où la raison d'une installation globale et locale de gulp.

Essentiellement, lorsque vous installez gulplocalement le script n'est pas dans votre PATHet vous ne pouvez donc pas simplement taper gulpet attendre que le shell trouve la commande. En l'installant globalement, le gulpscript pénètre dans votre PATHcar le node/bin/répertoire global est très probablement sur votre chemin.

Pour respecter vos dépendances locales, gulputilisez votre version de lui-même installée localement pour exécuter le gulpfile.js.

Dwayne Crooks
la source
1
~ / bin est une convention Unix pour les fichiers binaires par utilisateur, et dans PATH par défaut sur de nombreux systèmes d'exploitation. gulp devrait être capable de lier son binaire à partir de là.
mikemaccana
2
Autrement dit, votre gulppackage installé à l'échelle mondiale est nécessaire pour mettre node_modules/.bin/gulpen chemin. Le stockage est bon marché mais jeter MB pour simuler un lien symbolique est une négligence pure de l'OMI.
ntd
79

Vous pouvez lier le global installé gulplocalement avec

npm link gulp
Berislav Lopac
la source
1
Je sais qu'il est préférable d'utiliser des installations locales, mais il peut y avoir des cas où vous ne pouvez tout simplement pas l'installer ou ne le souhaitez tout simplement pas (imaginez que votre serveur CI dédié a gulp installé globalement et que vous le réinstallez à chaque validation) . Quoi qu'il en soit, +1 pour mentionner npm link.
gion_13
1
Je vois ce que tu as fait là. C'est malin.
deepelement
Cela ne tente pas de répondre à la question
mikemaccana
1
Non, cela l'annule.
Berislav Lopac
67

La question " Pourquoi devons-nous installer gulp globalement et localement? " Peut être décomposée en deux questions suivantes:

  1. Pourquoi dois-je installer gulp localement si je l'ai déjà installé globalement?

  2. Pourquoi dois-je installer gulp globalement si je l'ai déjà installé localement?

Plusieurs autres ont fourni d'excellentes réponses à ces questions isolément, mais j'ai pensé qu'il serait utile de consolider les informations dans une réponse unifiée.

Pourquoi dois-je installer gulp localement si je l'ai déjà installé globalement?

La justification de l'installation de gulp localement est composée de plusieurs raisons:

  1. L'inclusion locale des dépendances de votre projet garantit que la version de gulp (ou d'autres dépendances) utilisée est la version initialement prévue.
  2. Node ne prend pas en compte les modules globaux par défaut lors de l'utilisation de require () (que vous devez inclure gulp dans votre script). En fin de compte, cela est dû au fait que le chemin d'accès aux modules globaux n'est pas ajouté à NODE_PATH par défaut.
  3. Selon l'équipe de développement de Node, les modules locaux se chargent plus rapidement. Je ne peux pas dire pourquoi c'est, mais cela semble être plus pertinent pour l'utilisation du nœud en production (c'est-à-dire les dépendances d'exécution) que dans le développement (c'est-à-dire les dépendances de développement). Je suppose que c'est une raison légitime car certains peuvent se soucier de l'avantage de vitesse mineur obtenu en chargeant des modules locaux par rapport aux modules globaux, mais n'hésitez pas à lever les sourcils à cette raison.

Pourquoi dois-je installer gulp globalement si je l'ai déjà installé localement?

  1. La raison de l'installation de gulp à l'échelle mondiale est vraiment la commodité d'avoir l'exécutable gulp trouvé automatiquement dans votre chemin système.

Pour éviter l'installation locale, vous pouvez utiliser npm link [package], mais la commande link ainsi que la install --globalcommande ne semblent pas prendre en charge l' --save-devoption, ce qui signifie qu'il ne semble pas y avoir de moyen facile d'installer gulp globalement, puis d'ajouter facilement la version à votre fichier package.json local.

En fin de compte, je pense qu'il est plus logique d'avoir la possibilité d'utiliser des modules globaux pour éviter d'avoir à dupliquer l'installation d'outils communs dans tous vos projets, en particulier dans le cas d'outils de développement tels que grunt, gulp, jshint, etc. on dirait qu'on finit par se battre un peu contre les outils quand on va à contre-courant.

Derek Greer
la source
7
+1 pour avoir été la première personne sur Internet à signaler qu'il y a deux points à la question. Presque tout le monde répond juste "Pourquoi dois-je installer gulp globalement si je l'ai déjà installé localement?" quand ce que je voulais savoir était "Pourquoi dois-je installer gulp localement si je l'ai déjà installé globalement?".
Nathan JB
10
Le fait que cette question nécessite une explication aussi élaborée signifie que ce n'est tout simplement pas une façon très logique de travailler. L'installation du même outil encore et encore pour chaque projet ne devrait pas être nécessaire.
Kokodoko
4
Votre réponse est si belle sans émotion. Le mien aurait eu 80% de jurons, car cela semble être tellement stupide. Du point de vue de l'outillage, la théorie de l'installation locale est probablement correcte, mais du point de vue du système d'exploitation et du point de vue des gestionnaires de packages, c'est tellement fou que je ne peux pas trouver de mots pour cela. Quels médicaments les types NPM / gulp prennent-ils?!? Si quelqu'un n'est pas d'accord, veuillez lire comment le gestionnaire de packages système comme dpkg, yum, pacman et co. travail.
JepZ
2
@JepZ, c'est juste que Gulp est super bizarre, il n'y a rien dans le nœud ou le npm qui le force. Et garder des versions spécifiques de gulp dans le projet n'a de sens que si les gars de gulp cassent régulièrement des versions de correctifs ou quelque chose, d'autres outils de construction sont généralement une installation globale. Mais bon. Juste ici pour la prestation de serment.
Stoffe
2
Ce n'est vraiment plus un problème maintenant, car la communauté est passée à l'utilisation de fil :)
Derek Greer
8

Techniquement, vous n'avez pas besoin de l'installer globalement si le node_modulesdossier de votre installation locale se trouve dans votre PATH. Ce n'est généralement pas une bonne idée.

Sinon, si vous faites npm testréférence, gulpvous pouvez simplement taper npm testet il exécutera la gulp locale.

Je n'ai jamais installé gulp dans le monde - je pense que c'est une mauvaise forme.

robrich
la source
3
Une meilleure approche que de le mettre sur votre chemin est d'utiliser des scripts NPM
Jay
2

Je ne sais pas si notre problème était directement lié à l'installation de gulp uniquement localement. Mais nous avons dû installer nous-mêmes un tas de dépendances. Cela conduit à un "énorme" package.json et nous ne sommes pas sûrs que ce soit vraiment une bonne idée d'installer gulp uniquement localement. Nous avons dû le faire à cause de notre environnement de construction. Mais je ne recommanderais pas d'installer gulp pas globalement si ce n'est pas absolument nécessaire. Nous avons rencontré des problèmes similaires à ceux décrits dans le blog suivant

Aucun de ces problèmes ne se pose pour aucun de nos développeurs sur leurs machines locales car ils ont tous installé gulp dans le monde. Sur le système de build, nous avons eu les problèmes décrits. Si quelqu'un est intéressé, je pourrais approfondir ce problème. Mais pour l'instant, je voulais juste mentionner que ce n'est pas un chemin facile pour installer gulp uniquement localement.

tschoartschi
la source
Oui, veuillez approfondir ce problème.
kenorb
1

Juste parce que je ne l'ai pas vu ici, si vous êtes sur MacOS ou Linux, je vous suggère d'ajouter ceci à votre PATH (dans votre bashrc, etc.):

node_modules/.bin

Avec cette entrée de chemin relatif, si vous êtes assis dans le dossier racine de n'importe quel projet de noeud, vous pouvez exécuter n'importe quel outil de ligne de commande (eslint, gulp, etc. etc.) sans vous soucier des "installations globales" ou npm runetc.

Une fois que j'ai fait cela, je n'ai jamais installé de module globalement.

Elliot Nelson
la source