lunes, 25 de junio de 2012

NPM: Error, cannot find module

NPM (Node Package Manager) es el controlador de paquetes de NodeJS y es utilizado, entre otras muchas cosas, para instalar y publicar librerías (paquetes). Además permite controlar exhaustivamente las dependencias de las librerías para que no haya conflictos.

El controlador de paquetes al que hacemos mención viene instalado de serie junto a NodeJS, así que no deberemos instalarlo aparte. No posee interfaz gráfica, por lo que tendremos que manejarlo mediante la consola de comandos (npm), sin embargo si posee un repositorio web donde podremos consultar las librerías que han sido publicadas.

Uno de los comandos más utilizados en NPM es install, el cual nos permitirá instalar las librerías que más tarde podremos incluir desde nuestros scripts a través de la función require de NodeJS. A continuación se muestra un ejemplo que servirá para instalar, en este caso, la librería tuenti.

npm install tuenti
De esta manera instalaremos dicha librería en la ruta donde nos encontremos (éstas son guardadas dentro de la carpeta /node_modules/ de la ruta actual), por lo que tendrá un ámbito local y tal librería solamente podrá incluirse si el script ejecutado se encuentra dentro de esa ruta.

Como es de esperar esto puede acarrear diversos quebraderos de cabeza al querer mantener actualizadas todas nuestras librerias, pues los scripts pueden encontrarse en carpetas diferentes, utilizando cada uno de ello sus propias librerías, sin ninguna centralización.

Afortunadamente, el comando install de NPM posee un marcador para realizar una instalación bajo un ámbito global, es decir, que todas las instalaciones de librerías que se realicen con dicho marcador irán a parar a una carpeta en común, que forma parte del sistema y ya no será la ruta actual.

npm install tuenti -g
Para conocer la carpeta en la que son guardadas todas estás librerías con ámbito global podemos hacer uso del comando prefix y del marcador global.

npm prefix -g
Tan solo hay un inconveniente, y es que, al menos en Windows, NodeJS no tiene definida por defecto la carpeta anterior como global para la inclusión de sus librerías mediante require. Por lo que si intentamos incluir una libreria global obtendremos el siguiente error:

Error: Cannot find module
Para solucionarlo deberemos definir la variable del sistema NODE_PATH, dándole el valor de la ruta global de NPM (devuelta anteriormente) y añadiéndole la carpeta \node_modules\ al final.

En Windows 7 la ruta de instalación global de NPM es C:\Users\USER\AppData\Roaming\npm\, por lo que el valor de NODE_PATH será C:\Users\USER\AppData\Roaming\npm\node_modules\, o lo que es lo mismo %APPDATA%\npm\node_modules\.

setx NODE_PATH %APPDATA%\npm\node_modules\

No hay comentarios:

Publicar un comentario