unable run instalar how grunt create node.js module npm gruntjs

node.js - instalar - Cómo hacer que Grunt Deploy utilice módulos de NPM globales en lugar de los locales



instalar grunt linux (5)

En primer lugar, soy muy nuevo en npm y gruñido. Tenemos un proyecto al que estamos usando Grunt para compilar y producir los archivos de salida. Estoy intentando configurar nuestro servidor de compilación para usar Grunt para producir los archivos de salida. Estamos utilizando Windows con control de fuente TFS, y debido a su límite de ruta de 260 caracteres , no podemos verificar el módulo grunt-bower-task en el control de fuente ( ya que solo usa 230 caracteres en su ruta de acceso instalada ).

Cuando ejecuto npm install desde mi directorio de proyecto, funciona bien e instala los siguientes módulos requeridos en la carpeta node_modules en mi directorio de proyecto:

  • gruñido
  • gruñido-bower-tarea
  • grunt-contrib-compass
  • grunt-contrib-connect
  • grunt-contrib-jshint
  • grunt-contrib-requirejs
  • grunt-contrib-watch

Y luego, cuando ejecuto grunt deploy desde el directorio de mi proyecto, todo funciona como se esperaba.

Si bien podría simplemente hacer que running npm instale parte del proceso de compilación, prefiero no hacerlo, ya que lleva unos minutos descargar todos los archivos, y no quiero que nuestras compilaciones dependan de un servicio web externo que esté disponible.

He visto que puede instalar módulos de forma local o global , así que espero poder instalar los módulos globalmente en el servidor de compilación para que no necesiten estar en la carpeta node_modules directamente dentro del directorio del proyecto. ejecutando la implementación de grunt . He ejecutado npm install -g , así como npm install -g [module] para cada uno de los módulos enumerados anteriormente, así como también npm install -g grunt-cli .

Si hago npm prefijo -g , me muestra que el directorio del módulo global es C: / Users [Mi usuario] / AppData / Roaming / npm , y cuando miro en la carpeta node_modules de ese directorio, veo todos los módulos. Sin embargo, cuando ejecuto grunt deploy se queja con:

Error fatal: no se puede encontrar el gruñido local

Si incluyo solo el directorio * node_modules / grunt *, sigo recibiendo estos errores:

No se encontró el módulo Npm local "grunt-contrib-watch". ¿Está instalado?

No se encontró el módulo Npm local "grunt-contrib-jshint". ¿Está instalado?

...

También intenté usar * grunt deploy --base "C: / Users [My User] / AppData / Roaming / npm", pero se queja de que no puede encontrar otros archivos, como .jshintrc.

Entonces, ¿hay alguna manera de ejecutar el grunt deploy y hacer que verifique la ruta del prefijo global npm para los módulos, en lugar de buscar en el directorio del proyecto?

Un trabajo bastante práctico es copiar los módulos manualmente durante el proceso de compilación en el directorio del proyecto local, pero me gustaría evitar esto si es posible.

Como referencia, este es mi archivo package.json :

{ "name": "MyProject", "version": "0.0.1", "scripts": { "preinstall": "npm i -g grunt-cli bower" }, "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-compass": "~0.2.0", "grunt-contrib-watch": "~0.4.4", "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-requirejs": "~0.4.1", "grunt-contrib-connect": "~0.3.0", "grunt-bower-task": "~0.2.3" } }

Gracias.


Cuando el enlace npm no es lo suficientemente bueno (sistemas de archivos de red, ...), puede usar el paquete ''requireg'' . Esta es la única solución limpia que de alguna manera la hace ''incorporada''. El paquete ''requireg'' tiene una función de globalización que hace que las llamadas requeridas posteriores también se vean en global.


En lugar de utilizar la opción global para npm , debe usar enlaces simbólicos en sus módulos para lograr resultados similares.

Las instalaciones globales de npm están pensadas solo para conveniencia de las utilidades de línea de comandos, como jshint o grunt-cli .


Sé que este hilo es viejo, pero finalmente encontré mi propia respuesta personal, usando una Mac, pero supongo que lo mismo puede decirse / hacerse con la PC.

para seguir con la respuesta de bevacqua de:

En lugar de utilizar la opción global para npm, debe usar enlaces simbólicos en sus módulos para lograr resultados similares.

Las instalaciones globales de npm están pensadas solo para conveniencia de las utilidades de línea de comandos, como jshint o grunt-cli.

Hice algunas excavaciones y podría dar un poco más de aclaración:

Terminé haciendo una carpeta global en la raíz de mi directorio de usuario. Dentro de ese directorio, agregué todos los paquetes que necesitaba usando npm install . Entonces, por ejemplo, ejecuté npm install grunt , npm install grunt-contrib-watch , npm install grunt-contrib-less , etc. También puede agregar un archivo package.json en la misma carpeta y simplemente ejecutar npm install para agregarlos a todos en una vez. Ahora mi directorio global tenía la siguiente estructura:

.global_grunt_modules node_modules grunt grunt-contrib-watch grunt-contrib-less

Luego fui a cualquier directorio de proyecto en funcionamiento donde necesitaba ejecutar ronco, y en la raíz de esa carpeta ejecuté el comando:

ln -s ~/.global_grunt_modules/node_modules .

ln con el indicador -s (enlace simbólico) toma dos argumentos:

[source_file] [target_dir]

Así que el comando básicamente dice: "crea un enlace simbólico desde mi carpeta global node_modules, y vincúlalo a mi directorio actual". El . especifica el directorio de trabajo actual.

Espero que esto ayude, estaba teniendo problemas también. Entonces, cada vez que tengo un proyecto que requiere un nuevo módulo gruñón, simplemente lo instalo a través de mi directorio global, que luego estará disponible en todos los lugares donde se haya creado el enlace simbólico.


Solución: enumere explícitamente todas las dependencias transitorias en su propio paquete. Json.

Digamos, por ejemplo, que dependes de module_a, y que module_a depende de module_b. Después de la npm install , tendrás node_modules/module_a/node_modules/module_b/ porque npm instalará module_b local en module_a. Sin embargo, si agrega module_b como una dependencia directa en su package.json (y los especificadores de versión coinciden exactamente), entonces npm solo instalará module_b una vez: en el nivel superior.

Esto se debe a que cuando se requieren módulos, comienzan a buscar en el directorio node_modules más cercano y recorren hacia arriba hasta encontrar el módulo requerido. Entonces, npm puede ahorrar espacio en disco instalando solo el módulo en el nivel más bajo con el que coinciden las versiones.

Entonces, ejemplo revisado. Usted depende de [email protected] que depende de [email protected]. Si también dependes de [email protected], terminarás con module_b instalado dos veces. (La versión 0.1.0 se instalará en el nivel superior, y 0.2.0 se instalará en module_a). Sin embargo, si depende de v0.2.0 (usando la cadena de versión exacta en su paquete.json como usa module_a), entonces npm notará que puede usar la misma versión de module_b. Por lo tanto, solo instalará module_b en el nivel superior y no en module_a.

Para resumir: agregue las dependencias transitorias que tenga que tengan árboles de módulos profundos directamente a su propio paquete .json y terminará con un árbol node_modules más superficial.


Utilizo fenestrate para resolver este tipo de problemas en Windows. Incluso si funciona con Git, si usa la integración de Git desde Visual Studio en Team Explorer, aún se bloqueará si hay rutas de archivos largas en la carpeta node_modules, incluso si no está agregando esa carpeta al control de código fuente.

Por lo general, la estructura de dependencia de Grunt y Bower causa esto.

  1. Lo primero que recomendaría es ejecutar npm dedupe en sus paquetes. Lo que hace, es escanear tus paquetes ya instalados y ver si algunas dependencias están duplicadas. Si se encuentra en un nivel superior, eliminará los profundamente probados.

  2. En segundo lugar, si el dedupe no resuelve el problema, si puede encontrar la dependencia tan profundamente anidada que está causando este problema, intente instalarlo en su solución directamente y vuelva a ejecutar dedupe.

  3. Si hay más dependencias de paquetes que causan esto, fenestrate resolverá el problema. Además, es realmente genial porque puedes engancharlo a tu instalación npm y siempre se ejecutará después de que se instale un nuevo paquete. Además, es completamente reversible.

Espero que esto ayude.