node.js - instalar - NodeJS requiere un módulo/paquete global
npm install (7)
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 intento 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.
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 here
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 "compilar" todo el javascript que está incluido en el directorio del proyecto, realmente no puedo instalar ningún paquete.
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.
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.
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.
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.
Según la documentación , Node.js buscará en las siguientes ubicaciones de forma predeterminada:
$HOME/.node_modules
(global)Nota:
$HOME
es el directorio de inicio del usuario.-
$HOME/.node_libraries
(global) $PREFIX/lib/node
(global)Nota:
$PREFIX
es elnode_prefix
configurado denode_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 compilación y es relativo aprocess.execPath
. No confundir con el valor delnpm config get prefix
. sourceCarpeta
node_modules
actual. (local)Ruta especificada en la variable de entorno
NODE_PATH
.Nota:
NODE_PATH
variable de entornoNODE_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.ejecho ''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 deecho ''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 poruserconfig
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.ejrequire("/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
here en la carpeta actual desde la ubicación del paquete global. P.ej
npm link forever