2011년 8월 8일 월요일

[Node.JS] npm 광역설치 시 모듈을 못 찾는 문제

npm으로 Node.JS용 모둘을 광역 설치(-g) 했을 때 모듈을 못 찾는 경우가 있다. 내 경우 homebrew로 Node.JS를 설치한 상태에서 기본적인 방법으로 npm을 설치한 상태였는데 -g 옵션으로 설치한 모듈을 전혀 읽지 못 하였다.

아래 에러 로그는 npm install -g express jade 명령으로 express와 jade를 광역설치한 상태에서 해당 모듈을 사용하는 스크립트를 구동했을 때 찍히는 에러로그이다.
node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Cannot find module 'express'
    at Function._resolveFilename (module.js:322:11)
    at Function._load (module.js:267:25)
    at require (module.js:351:19)
    at Object.<anonymous> (/Users/hirenn/Devel/tmp/test.js:1:77)
    at Module._compile (module.js:407:26)
    at Object..js (module.js:413:10)
    at Module.load (module.js:339:31)
    at Function._load (module.js:298:12)
    at Array.<anonymous> (module.js:426:10)
    at EventEmitter._tickCallback (node.js:126:26)
문제의 원인은 모듈이 설치되는 디렉토리에 있다.
  • npm으로 설치한 모듈은 /usr/local/lib/node_modules에 설치된다.
  • 하지만 Node.JS는 모듈을 /usr/local/lib/node에서 찾는다.

그렇다면 단순히 해결을 위해서는 node_modules의 내용을 node로 몽땅 복사해 주면 될 것이다. 하지만 이렇게 해 버리면 npm으로 모듈을 새로 설치할 때 마다 복사해 줘야 하는 수고가 발생한다.

따라서 효율적으로 문제을 해결하기 위해서는 node_modules를 node로 링크를 걸어주면 될 것이다.

우선 링크를 걸기 전에 /usr/local/lib/node 디렉토리의 내용을 살펴보니 wafadmin 라는 심볼릭 링크가 하나 걸려 있었다. 그래서 이 링크를 node_modules에도 동일하게 걸어준다.
$ cd /usr/local/lib/node
$ ls -al
total 8
drwxr-xr-x   3 user    group   102  5 24 12:33 ./
drwxr-xr-x  32 user    group  1088  8  5 14:48 ../
lrwxr-xr-x   1 user    group    41  5 24 12:33 wafadmin@ -> ../../Cellar/node/0.4.8/lib/node/wafadmin

$ ln -s ../../Cellar/node/0.4.8/lib/node/wafadmin /usr/local/lib/node_modules/
그리고 기존 node디렉토리를 old.node로 변경하고(혹은 삭제하고) node_modules를 node로 링크를 걸어준다.
$ mv node old.node
$ ln -s /usr/local/lib/node_modules node
이 후 확인을 해 보니 모듈을 제대로 읽어들이게 되었다.

추신) 이 해결법에서 경로 등의 정보는 Node.JS의 버전이나 설치된 환경에 따라 달라질 수 있다.

댓글 2개 :

익명 :

감사합니다 ^^ 덕분에 쉽게 해결하였습니다.

안상학 :

감사합니다~ 음..전 ejs가 에러였는데 ln이 뭔지는 몰라 일단 전 /usr/local/lib/node/에 복사해서 해결했습니다.