¿Por qué necesitamos instalar gulp global y localmente?

292

2 manuales sobre gulp dicen que necesito instalar gulp primero globalmente (con el indicador -g) y luego una vez más localmente. ¿Por qué necesito esto?

Stepan Suvorov
fuente
12
La propia página "Comenzando" del proyecto dice lo mismo. (Tampoco dice por qué.)
TJ Crowder
11
Desearía que npm pudiera usar un paquete de dependencia instalado globalmente que sea la misma versión que el paquete local. 5 MB de material glup para cada directorio de proyecto: /
Ciantic
@Ciantic Sin garantías, pero ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Respuestas:

238

Al instalar una herramienta globalmente, debe ser utilizada por un usuario como una utilidad de línea de comando en cualquier lugar, incluso fuera de los proyectos de nodo. Las instalaciones globales para un proyecto de nodo son malas porque dificultan la implementación.

npm 5.2+

La npxutilidad incluida con npm 5.2resuelve este problema. Con él puede invocar utilidades instaladas localmente como utilidades instaladas globalmente (pero debe comenzar el comando con npx). Por ejemplo, si desea invocar a un local instalado eslint, puede hacer:

npx eslint .

npm <5.2

Cuando se usa en un scriptcampo de su package.json, npmbusca node_modulesla herramienta y los módulos instalados globalmente, por lo que la instalación local es suficiente.

Entonces, si está satisfecho con (en su package.json):

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

etc. y ejecutando con, npm run testentonces no debería necesitar la instalación global en absoluto.

Ambos métodos son útiles para que las personas configuren su proyecto, ya sudoque no es necesario. También significa que gulpse actualizará cuando la versión se encuentre en el paquete.json, por lo que todos usarán la misma versión de Gulp cuando desarrollen con su proyecto.

Apéndice:

Parece que tragar tiene un comportamiento inusual cuando se usa globalmente. Cuando se usa como una instalación global, gulp busca un trago instalado localmente para pasarle el control. Por lo tanto, una instalación global de Gulp requiere una instalación local de Gulp para funcionar. Sin embargo, la respuesta anterior sigue en pie. Las instalaciones locales siempre son preferibles a las instalaciones globales.

qubyte
fuente
3
Sí, pero ¿qué pasa cuando no tienes acceso a internet? ¿Cómo puedes usar gulp si no está instalado globalmente?
IGRACH
3
@IGRACH La secuencia de comandos anterior no utiliza una conexión a Internet. Si desea hacer lo mismo sin usar un campo de script en package.json, use ./node_modules/.bin/gulp.
qubyte
1
He definido por los alias gulpy coffeelo que los comandos trabajar desde mi nodo raíz del proyecto (por ejemplo. alias gulp="node_modules/.bin/gulp"). De esta forma, los comandos son fáciles de usar si es necesario y no se producen conflictos de versión global / local.
vesse
Gracias @qubyte! Creo que instalarlo localmente es una buena práctica en general. Tengo una pregunta más, así que espero que puedan ayudarme a aclarar mi mente. Intenté instalarlo globalmente como sugirió el documento de Gulp sin instalarlo localmente. Entonces, cuando intento ejecutar gulp, me da el siguiente mensaje de error Local gulp not found in .... Por lo que yo entiendo, primero debería mirar a los nodos locales_módulos y, si no se encuentra, debería mirar a los módulos instalados globalmente, ¿no? ¡Gracias!
yeelan
1
Se agregó un apéndice. Con suerte, eso cubre la extrañeza del trago.
qubyte
82

TLDR; He aquí por qué :

La razón por la que esto funciona es porque gulpintenta ejecutar su gulpfile.jsuso de su versión instalada localmente gulp, consulte aquí . De ahí la razón de una instalación global y local de trago.

Esencialmente, cuando instala gulplocalmente, el script no está en su PATHarchivo y, por lo tanto, no puede simplemente escribir gulpy esperar que el shell encuentre el comando. Al instalarlo globalmente, el gulpscript ingresa a usted PATHporque el node/bin/directorio global probablemente se encuentre en su ruta.

Sin embargo, para respetar sus dependencias locales, gulpusará su versión instalada localmente para ejecutar el gulpfile.js.

Dwayne Crooks
fuente
1
~ / bin es una convención de Unix para binarios por usuario, y en PATH por defecto en muchos sistemas operativos. trago debería poder vincular su binario desde allí.
mikemaccana
2
Dicho en otras palabras, su gulppaquete instalado globalmente es necesario para ponerlo node_modules/.bin/gulpen ruta. El almacenamiento es barato, pero tirar MB para simular un enlace simbólico es un descuido IMO.
ntd
79

Puede vincular gulplocalmente instalado globalmente con

npm link gulp
Berislav Lopac
fuente
1
Sé que es mejor usar instalaciones locales, pero puede haber casos en los que simplemente no puedas instalarlo o simplemente no quieras (imagina que tu servidor de CI dedicado tiene un trago instalado globalmente y lo estás reinstalando en cada confirmación) . De todos modos, +1 por mencionar npm link.
gion_13
1
Veo lo que hiciste alli. Eso es inteligente.
profundización
Esto no intenta responder la pregunta
mikemaccana
1
No, solo lo invalida.
Berislav Lopac
67

La pregunta " ¿Por qué necesitamos instalar gulp a nivel mundial y local? " Se puede dividir en las siguientes dos preguntas:

  1. ¿Por qué necesito instalar Gulp localmente si ya lo he instalado globalmente?

  2. ¿Por qué necesito instalar Gulp globalmente si ya lo he instalado localmente?

Varios otros han proporcionado excelentes respuestas a estas preguntas de forma aislada, pero pensé que sería beneficioso consolidar la información en una respuesta unificada.

¿Por qué necesito instalar Gulp localmente si ya lo he instalado globalmente?

La razón para instalar Gulp localmente se compone de varias razones:

  1. La inclusión local de las dependencias de su proyecto garantiza que la versión de gulp (u otras dependencias) utilizada sea la versión original prevista.
  2. Node no considera los módulos globales de forma predeterminada cuando utiliza require () (que debe incluir gulp dentro de su script). En última instancia, esto se debe a que la ruta a los módulos globales no se agrega a NODE_PATH de manera predeterminada.
  3. Según el equipo de desarrollo de Node, los módulos locales se cargan más rápido. No puedo decir por qué esto es así, pero esto parece ser más relevante para el uso del nodo en la producción (es decir, dependencias de tiempo de ejecución) que en el desarrollo (es decir, dependencias de desarrollo). Supongo que esta es una razón legítima, ya que algunos pueden preocuparse por cualquier ventaja menor de velocidad que se obtenga al cargar módulos locales versus globales, pero no dude en levantar la ceja por este motivo.

¿Por qué necesito instalar Gulp globalmente si ya lo he instalado localmente?

  1. La razón para instalar gulp a nivel mundial es realmente la conveniencia de que el ejecutable de gulp se encuentre automáticamente dentro de la ruta de su sistema.

Para evitar la instalación local, puede usar npm link [package], pero el comando de enlace y el install --globalcomando no parecen admitir la --save-devopción, lo que significa que no parece haber una manera fácil de instalar Gulp a nivel mundial y luego agregar fácilmente cualquier versión que sea su archivo package.json local.

En última instancia, creo que tiene más sentido tener la opción de usar módulos globales para evitar tener que duplicar la instalación de herramientas comunes en todos sus proyectos, especialmente en el caso de herramientas de desarrollo como grunt, gulp, jshint, etc. Desafortunadamente Parece que terminas luchando un poco contra las herramientas cuando vas contra la corriente.

Derek Greer
fuente
77
+1 por ser la primera persona en todo Internet en señalar que hay dos puntos en la pregunta. La mayoría de las personas en todas partes simplemente responden "¿Por qué necesito instalar Gulp globalmente si ya lo he instalado localmente?" cuando lo que quería saber era "¿Por qué necesito instalar gulp localmente si ya lo he instalado globalmente?".
Nathan JB
10
El hecho de que esta pregunta necesite una explicación tan elaborada significa que esto simplemente no es una forma muy lógica de trabajar. Instalar la misma herramienta una y otra vez para cada proyecto no debería ser necesario.
Kokodoko
44
Tu respuesta es tan hermosa sin emociones. La mía habría tenido un 80% de palabrotas, ya que esto parece ser tan estúpido. Desde la perspectiva de las herramientas, la teoría de la instalación local probablemente sea correcta, pero desde la perspectiva del sistema operativo y la perspectiva de los administradores de paquetes esto es tan loco que no puedo encontrar palabras para ello. ¿Qué drogas toman los chicos de NPM / trago? Si alguien no está de acuerdo, lea cómo el administrador de paquetes del sistema como dpkg, yum, pacman y co. trabajo.
JepZ
2
@JepZ es solo un trago súper extraño, sin embargo, no hay nada en el nodo o npm que lo obligue. Y mantener versiones específicas de Gulp en el proyecto solo tiene sentido si los chicos de Gulp rompen las versiones de parches de forma regular o algo así, otras herramientas de compilación suelen ser una instalación global. Pero ah bueno. Justo aquí para jurar.
Stoffe
2
Realmente no es un problema ahora, ya que la comunidad ha pasado a usar solo hilo :)
Derek Greer
8

Técnicamente, no necesita instalarlo globalmente si la node_modulescarpeta en su instalación local está en su PATH. En general, esta no es una buena idea.

Alternativamente, si se trata de npm testreferencias gulp, puede escribir npm testy ejecutará el trago local.

Nunca he instalado gulp a nivel mundial, creo que es una mala forma.

Robrich
fuente
3
Un mejor enfoque que ponerlo en su camino es usar scripts NPM
Jay
2

No estoy seguro de si nuestro problema estaba directamente relacionado con la instalación de gulp solo localmente. Pero tuvimos que instalar un montón de dependencias nosotros mismos. Esto condujo a un paquete "enorme". Json y no estamos seguros de si realmente es una gran idea instalar gulp solo localmente. Tuvimos que hacerlo debido a nuestro entorno de construcción. Pero no recomendaría instalar Gulp no globalmente si no es absolutamente necesario. Nos enfrentamos a problemas similares a los descritos en la siguiente publicación de blog.

Ninguno de estos problemas surge para ninguno de nuestros desarrolladores en sus máquinas locales porque todos instalaron trago globalmente. En el sistema de compilación tuvimos los problemas descritos. Si alguien está interesado, podría profundizar en este tema. Pero en este momento solo quería mencionar que no es un camino fácil para instalar gulp solo localmente.

tschoartschi
fuente
Sí, por favor, profundice en este tema.
kenorb
1

Solo porque no lo he visto aquí, si está en MacOS o Linux, le sugiero que agregue esto a su RUTA (en su bashrc, etc.):

node_modules/.bin

Con esta entrada de ruta relativa, si está sentado en la carpeta raíz de cualquier proyecto de nodo, puede ejecutar cualquier herramienta de línea de comando (eslint, gulp, etc., etc.) sin preocuparse por las "instalaciones globales" o npm runetc.

Una vez que hice esto, nunca instalé un módulo a nivel mundial.

Elliot Nelson
fuente