NodeJS requiere un módulo / paquete global

Intento instalarlo globalmente y luego usarlo forever y forever-monitor siguiente manera:

npm install -g forever forever-monitor

Veo el resultado habitual y también las operaciones que copian los archivos en la ruta global, pero luego si bash require("forever"); Aparece un error que dice que el módulo no se encontró.

Estoy usando la última versión de node y npm y ya sé sobre el cambio que hizo npm en la instalación global vs local, pero realmente no quiero instalar localy en cada proyecto y estoy trabajando en una plataforma que no funciona No npm link link así que npm link después de una instalación global no es posible para mí.

Mi pregunta es: ¿por qué no puedo solicitar un paquete instalado a nivel mundial? ¿Es eso una característica o un error? ¿O estoy haciendo algo mal?

PD: Para dejarlo en claro: no quiero instalarlo localmente.

En Node.js, require no se ve en la carpeta donde están instalados los módulos globales.

Puede solucionar esto configurando la variable de entorno NODE_PATH. En Linux esto será:

 export NODE_PATH=/usr/lib/node_modules 

Nota: Esto depende de dónde estén instalados sus módulos globales.

Ver: Cargando desde las carpetas globales .

Después de instalar el paquete globalmente, debe vincular el proyecto local con el paquete global

 npm install express -g cd ~/mynodeproject/ npm link express 

Mira aquí

Disculpas por la nigromancia pero puedo especificar rutas codificadas para módulos instalados globalmente:

 var pg = require("/usr/local/lib/node_modules/pg"); 

Esto no es perfecto, pero considerando que Unity3d intenta “comstackr” todo el javascript que está incluido en el directorio del proyecto, realmente no puedo instalar ningún paquete.

Sé que esta es una vieja pregunta, pero me encontré con esto cuando trato de hacer una comprobación de versiones usando semver en una secuencia de comandos de preinstall en package.json . Como sabía que no podía depender de ningún módulo local instalado, lo utilicé para requerir semver de la carpeta global node_modules (ya que npm depende de eso, sé que está allí):

 function requireGlobal(packageName) { var childProcess = require('child_process'); var path = require('path'); var fs = require('fs'); var globalNodeModules = childProcess.execSync('npm root -g').toString().trim(); var packageDir = path.join(globalNodeModules, packageName); if (!fs.existsSync(packageDir)) packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm if (!fs.existsSync(packageDir)) throw new Error('Cannot find global module \'' + packageName + '\''); var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString()); var main = path.join(packageDir, packageMeta.main); return require(main); } 

Me gusta este enfoque porque no requiere la instalación de ningún módulo especial para su uso.

No fui con una solución NODE_PATH como otros han sugerido, ya que quería que esto funcionara en la máquina de cualquier persona, sin tener que requerir configuración / configuración adicional antes de ejecutar npm install para mi proyecto.

La forma en que esto está codificado, solo está garantizado para encontrar módulos de nivel superior (instalados usando npm install -g ... ) o módulos requeridos por npm (enumerados como dependencies aquí: https://github.com/npm/npm/ blob / master / package.json ). Si está utilizando una versión más nueva de NPM, puede encontrar dependencias de otros paquetes instalados globalmente, ya que ahora hay una estructura más plana para las carpetas node_modules .

Espero que sea útil para alguien.

Puede usar el paquete requireg para resolver este problema:

 var forever = require('requireg')('forever') 

hará el truco

Además, hay otro módulo, global-npm , aunque específico para simplemente usar el npm global, puedes mirar el código corto y ver cómo funciona la técnica.

Según la documentación , Node.js buscará en las siguientes ubicaciones de forma predeterminada:

  1. $HOME/.node_modules (global)

    Nota: $HOME es el directorio de inicio del usuario.

  2. $HOME/.node_libraries (global)
  3. $PREFIX/lib/node (global)

    Nota: $PREFIX es el node_prefix configurado de node_prefix

    Para verificar el valor actual de node_prefix , ejecuta:

     node -p process.config.variables.node_prefix 

    Nota: El prefijo corresponde a --prefix param durante la comstackción y es relativo a process.execPath . No confundir con el valor del npm config get prefix . fuente

  4. Carpeta node_modules actual. (local)

  5. Ruta especificada en la variable de entorno NODE_PATH .

    Nota: NODE_PATH variable de entorno NODE_PATH está configurada en una lista delimitada por dos puntos de rutas absolutas.

Si el módulo dado no puede ser encontrado, eso significa que no está presente en una de las ubicaciones anteriores.

La ubicación de la carpeta raíz global donde se instalan los módulos se puede imprimir por: npm root -g (de forma predeterminada, la ruta se calcula en tiempo de ejecución a menos que se npmrc en el archivo npmrc ).

Solución

Puede probar las siguientes soluciones alternativas:

  • Especifique la ubicación de su módulo global en la variable de entorno NODE_PATH . P.ej

     echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 

    Para probar e imprimir el valor de NODE_PATH , ejecuta:

     echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
  • Para una solución más permanente, enlace su carpeta de usuario global $HOME/.node_modules para que apunte a la carpeta raíz ejecutando este comando:

     ln -vs "$(npm root -g)" "$HOME"/.node_modules 

    Luego vuelva a probarlo mediante: echo 'require("forever")' | node comando de echo 'require("forever")' | node .

  • Cambie temporalmente la carpeta actual a la que se ha instalado la extensión de forma global, antes de invocar el script. P.ej

     npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd - 
  • Configure el destino de instalación global en el archivo npm userconfig (consulte: npm help 5 npmrc ) o por userconfig param ( --prefix ).

    Para mostrar la configuración actual, ejecute: npm config list .

    Para editar la configuración actual, ejecute: npm config edit .

  • Especifique la ruta completa de la ubicación de los módulos de nodo al llamar a require() . P.ej

     require("/path/to/sub/module") 
  • Instale el paquete en una ubicación personalizada, por ejemplo

     npm install forever -g --prefix "$HOME"/.node_modules 

    Sin embargo, la instalación irá bajo ~/.node_modules/lib/node_modules/ , por lo que la ubicación aún necesita ser agregada.

    Ver: npm paquete de instalación local a la ubicación personalizada

  • Cree un enlace simbólico en la carpeta actual desde la ubicación del paquete global. P.ej

     npm link forever 

Puedes poner esta línea en tu archivo .profile :

export NODE_PATH = “$ (npm config get prefix) / lib / node_modules”

Esto hará que el node use la ruta global.

    Intereting Posts