Estoy tratando de instalar globalmente y luego usar forever
y forever-monitor
así:
npm install -g forever forever-monitor
Veo el resultado habitual y también las operaciones que copian los archivos a la ruta global, pero luego, si lo intento require("forever");
, aparece un error que dice que no se encontró el módulo.
Estoy usando la última versión tanto de nodo como de npm y ya sé sobre el cambio que hizo npm en la instalación global versus local, pero realmente no quiero instalarlo localmente en cada proyecto y estoy trabajando en una plataforma que no No lo soporto, link
así que npm link
después de una instalación global no es posible para mí.
Mi pregunta es: ¿por qué no puedo requerir un paquete instalado globalmente? ¿Es eso una característica o un error? ¿O estoy haciendo algo mal?
PD: Solo para que quede claro como el cristal: no quiero instalarlo localmente.
~/.config/yarn/global
para el hiladoRespuestas:
En Node.js, require no busca 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á:
Nota: Esto depende de dónde estén realmente instalados sus módulos globales.
Ver: Cargando desde las carpetas globales .
fuente
export NODE_PATH=/usr/local/lib/node_modules
en su lugar.NODE_PATH
variable de entornoC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
funcione.%AppData%\npm\node_modules
funcionará en Windows 10.NODE_PATH
¿puedo usar módulos globales y locales simultáneamente?NODE_PATH=$(npm root -g)
Después de instalar el paquete globalmente, debe vincular el proyecto local con el paquete global
Ver aquí
fuente
~/some-stand-alone-random-nodejs-test.js
. No quiero convertir mi carpeta de inicio en un directorio de proyecto. No quiero crear nuevas carpetas para cada pequeño experimento.npm link <module>
Luego verá un acceso directo (enlace) creado en la carpeta node_module de sus proyectos que hace referencia al módulo de nodo global.Disculpas por la nigromancia, pero puedo especificar rutas codificadas a los módulos instalados globalmente:
Esto no es perfecto, pero teniendo en cuenta que Unity3d intenta "compilar" todos los javascript incluidos en el directorio del proyecto, realmente no puedo instalar ningún paquete.
fuente
Sé que esta es una vieja pregunta, pero me encontré con esto cuando intentaba hacer una verificación de versión usando
semver
unpreinstall
scriptpackage.json
. Como sabía que no podía depender de ningún módulo local instalado, utilicé esto para solicitarlosemver
desde lanode_modules
carpeta global (ya quenpm
depende de él, sé que está allí):Me gusta este enfoque porque no requiere la instalación de ningún módulo especial para poder usarlo.
No elegí una
NODE_PATH
solución como han sugerido otros, ya que quería que esto funcione en la máquina de cualquier persona, sin tener que requerir una configuración / configuración adicional antes de ejecutarnpm install
mi proyecto.De la forma en que esto está codificado, solo está garantizado encontrar módulos de nivel superior (instalados usando
npm install -g ...
) o módulos requeridos pornpm
(enumeradosdependencies
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 lasnode_modules
carpetas.Espero que sea útil para alguien.
fuente
Según la documentación , Node.js buscará en las siguientes ubicaciones de forma predeterminada:
Ruta especificada en la
NODE_PATH
variable de entorno .Nota:
NODE_PATH
la variable de entorno se establece en una lista delimitada por dos puntos de rutas absolutas.node_modules
Carpeta actual (local)$HOME/.node_modules
(global)Nota:
$HOME
es el directorio de inicio del usuario.$HOME/.node_libraries
(global)$PREFIX/lib/node
(global)Nota:
$PREFIX
Node.js está configuradonode_prefix
.Para verificar el valor actual de
node_prefix
, ejecute: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
comando. fuenteSi no se puede encontrar el módulo dado, 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 mediante:
npm root -g
(de forma predeterminada, la ruta se calcula en tiempo de ejecución a menos que se anule en elnpmrc
archivo ).Solución
Puede probar las siguientes soluciones alternativas:
Especifique la ubicación de su módulo global en
NODE_PATH
la variable de entorno. P.ejPara probar e imprimir el valor de
NODE_PATH
, ejecute:Para una solución más permanente, vincule su
$HOME/.node_modules
carpeta de usuario global para apuntar a la carpeta raíz, ejecutando este comando:Luego vuelva a probarlo mediante:
echo 'require("forever")' | node
comando.Cambie temporalmente la carpeta actual a donde la extensión se ha instalado globalmente, antes de invocar el script. P.ej
Configure el destino de instalación global en el
npm
archivo 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
require()
. P.ejInstale el paquete en una ubicación personalizada, p. Ej.
Sin embargo, la instalación continuará
~/.node_modules/lib/node_modules/
, por lo que la ubicación aún debe agregarse.Consulte: paquete de instalación local de npm en una ubicación personalizada
Cree un enlace simbólico en la carpeta actual desde la ubicación del paquete global. P.ej
fuente
Puede usar el paquete
requireg
para resolver este problema:Hará el truco.
Además, hay otro módulo,
global-npm
aunque específico para usar solo el globalnpm
, puede mirar el código corto y ver cómo funciona la técnica.fuente
NODE_PATH
bueno de esto es que no necesitas cambiar ningún código. (mi caso de uso está calificando muchos proyectos de estudiantes, donde no quiero ejecutarnpm install
para cada uno, y tampoco quiero que proporcionen unnode_modules
directorio).requireg
en primer lugar, este es el punto.Para las utilidades de CLI que dependen de módulos grandes, como
puppeteer
, me gusta generar aynpm root -g
usarlo para requerir el módulo global.fuente
Puede poner esta línea en su
.profile
archivo:Esto hará
node
uso de la ruta global.fuente
node_modules
. Esta es una vieja respuesta, pero recuerdo que la obtuve de alguna parte de la documentación. De todos modos, en mi computadora (en 2020) elnode_modules
directorio global npm esusr/lib/node_modules
. De todos modos, confíonpm config get prefix
porque npm lo usa globalmente cada vez que se instala un paquete global, por lo que debería ser correcto.package.json
archivo o enyarn.lock
/package-lock.json
.node_modules
carpeta, luego es padre, luego es padre, ... hasta que encuentre unanode_modules
carpeta que contenga ese módulo. Sin embargo, si instala un paquete globalmente, no estará dentro de ningunanode_modules
carpeta sobre el directorio actual del script, por lo que usará NODE_PATH como alternativa donde el nodo buscará paquetes.