노드에서 전역 모듈을 가져 오려면 어떻게합니까? “오류 : <module> 모듈을 찾을 수 없습니다”라는 메시지가 나타 납니까?


145

Mac OSX Lion에서 노드를 설정하려고합니다. 모두 제대로 작동하는 것 같지만 전역 모듈 폴더에서 모듈을 가져올 수 없습니다. 오류가 발생합니다.

Error: Cannot find module <module>

내가 이것을 실행하면 : node -e require.paths내가 얻는 응답은 다음과 같습니다.

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

맞습니다. 제 모듈은 / usr / local / lib / node_modules에 실제로 설치되어 있습니다. 그러나 스크립트를 실행하려고하면 다음과 같은 결과가 나타납니다.

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

내 .bash_profile은 다음과 같습니다.

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

도움을 주셔서 감사합니다. 왜 라이브러리를 가져올 수 없는지 모르겠습니다.


1
이것이 일을하는 데 선호되는 방법이 아니라는 것을 알고 있습니까?
thejh

1
좀 더 자세히 설명해 주시겠습니까? 전역 폴더에 라이브러리를 설치하지 말아야합니까?
한판

3
@Hanpan : require ()를 통해 로컬에서 사용하려는 모듈을 설치하는 것이 좋습니다.
thejh

1
더 좋고 업데이트 된 답변 (에 의존하지 않음 npm link)은 여기에서 찾을 수 있습니다 : stackoverflow.com/a/15646750/2671392
GGG

1
저는 구식이며 전 세계에 도서관을 설치하는 데 익숙했습니다. 로컬 라이브러리 설치를 많이 사용하는 확실한 이유를 본 적이 없습니다. 제가 가지고있는 mongodb 수업은 우리가 완료 될 때까지 거의 100 개의 작은 프로젝트로 끝나게됩니다. 각각은 mongodb, express, 통합 등과 같은 대부분의 복제 된 라이브러리 세트를 포함합니다. 지역 도서관의 모든 장소. 지역 스칼라 저장소에 수천 개의 스칼라 라이브러리가 있어야합니다. Ditto Meteor, 그루비 및 루비.
Stephen W. Wright

답변:


116

npm> = 1.0 npm link <global-package>을 사용하는 경우 이미 전역에 설치된 패키지에 대한 로컬 링크를 만드는 데 사용할 수 있습니다 . ( 주의 사항 : OS는 심볼릭 링크를 지원해야합니다. )

그러나 이것은 문제가없는 것은 아닙니다.

npm 링크는 개발 도구입니다. 그것은이다 멋진 지역 개발 상자에서 패키지를 관리. 그러나 npm 링크를 사용하여 배포하면 기본적으로 문제가 발생합니다. 실현하지 않고도 업데이트하기가 매우 쉽기 때문입니다.

대안으로 패키지를 로컬뿐만 아니라 전역으로 설치할 수 있습니다.

추가 정보는 다음을 참조하십시오.


69
나는 이것을 읽고 내 눈을 믿을 수 없습니다. 따라서 Express를 설치하고 말한 다음 Express 위에 빌드 할 20 개의 프로젝트가있는 경우 각 프로젝트 폴더마다 반복해서 20 번 설치해야합니까? 나는 패키지 관리자와 많은 경험이 없지만이 좀 짜증 ...
treznik

25
맞습니다. 생각하면 말이됩니다. 종속성을 로컬로 관리하면 모든 것이 독립적으로 유지되며 특정 프로젝트에 대해 특정 버전의 종속성을 지정할 수 있습니다 (예 : 프로젝트 foo에는 express 2.x가 필요하지만 프로젝트 표시 줄은 express 3 베타를 사용할 수 있음).
grahamb

43
나는 이것의 논리를 잠시 이해하는 데 어려움을 겪었지만 루비 친구들이 글로벌 패키지 업데이트로 어려움을 겪고 보석 세트에 대해 논쟁하고 종종 결코 업그레이드하지 않는 것을 본 후에 종속성을 로컬로 설치하는 것이 절대적으로 유일한 방법이라고 생각했습니다. 패키지 관리 .
timoxley

3
이 상황과 소프트웨어의 배포와 관련된 정적 연결 라이브러리와 동적 연결 라이브러리의 상황을 유사하게 만들고 싶습니다. iOS App Store에 배포 된 거의 모든 앱은 iOS SDK에서 제공하지 않는 종속성을 정적으로 연결해야합니다. 왜 이렇게됩니까? 글로벌 의존성 지옥은 매우 현실입니다.
Steven Lu

1
또한 npm캐시 (에있는 ~/.npm)가 다른 위치에서 수행되는 재설치 프로세스를 신속하게 수행 할 것임을 이해합니다 .
Steven Lu

85

Node.js는 환경 변수 NODE_PATH를 사용하여 모듈 검색 경로에 포함 할 추가 디렉토리를 지정할 수 있습니다. npm자체적으로 npm root -g명령을 사용하여 전역 모듈이 저장된 위치를 알 수 있습니다 . 따라서이 두 가지를 결합하면 다음 명령을 사용하여 전역 모듈이 검색 경로에 포함되도록 할 수 있습니다 (Linux의 경우).

export NODE_PATH=$(npm root --quiet -g)


3
NODE_PATH환경 변수 힌트에 감사드립니다 . 그것은 많은 도움이되었습니다!
rekire

7
이것은 최고 의견이어야합니다
Adam Prax

NODE_PATHnpm이 MSYS2에서 작동하도록 동등한 posix 경로 로 설정 해야했습니다. 감사합니다.
Joyce Babu

Windows 및 Git bash에서도 작동합니다. 완전한. :-)
inf3rno

이렇게하면 .node_modules폴더를 검색 할 수 있지만를 사용하여 모듈을 가져 오려면 require()여전히 로컬 프로젝트 디렉토리에 설치해야합니다 (또는를 사용하여 링크 됨 npm link). 글로벌 모듈은 프로젝트에서 가져올 수 없으며 바이너리 / 스크립트 만 실행할 수 있습니다.
Prahlad Yeri

65

npm 링크를 사용하여 프로젝트 폴더에서 전역 패키지에 대한 심볼릭 링크를 만들 수 있습니다.

예:

$ npm install -g express
$ cd [local path]/project
$ npm link express

로컬 node_modules 폴더를 만든 다음 symlink express-> [global directory] / node_modules / express를 만들어서 해결할 수 있습니다. require('express')


이 OS 간 호환성이 있습니까?
UpTheCreek

github.com/npm/npm/commit/… 이후의 최신 버전의 Windows에서 지원됩니다. 이전 Windows 버전의 경우 npmjs.com/package/npm-junction
Alex

22

아래와 같이 패키지를 전체적으로 설치하십시오.

$ npm install -g replace  // replace is one of the node module.

이 교체 모듈이 전체적으로 설치되므로 노드 모듈 폴더가 표시되면 교체 모듈이 표시되지 않으므로 require ( 'replace')를 사용하여이 패키지를 사용할 수 없습니다.

요구 사항이 있으면 노드 모듈 폴더에있는 로컬 모듈 만 사용할 수 있기 때문입니다.

이제 전역 모듈을 사용하려면 아래 명령을 사용하여 노드 모듈 경로와 연결해야합니다.

$ npm link replace

이제 돌아가서 노드 모듈 폴더를 확인하십시오. 이제 모듈 교체를 볼 수 있으며 로컬 노드 모듈과 연결되어 있으므로 응용 프로그램에서 require ( 'replace')와 함께 사용할 수 있습니다.

더 자세한 설명이 필요하면 Pls에 알려주십시오.


14

글로벌 모듈 디렉토리의 경로와 함께 require를 인수로 사용할 수 있습니다.

require('/path/to/global/node_modules/the_module');

내 Mac에서는 다음을 사용합니다.

require('/usr/local/lib/node_modules/the_module');

글로벌 모듈의 위치를 ​​찾는 방법은 무엇입니까? -> npm은 패키지를 어디에 설치합니까?


7

환경 변수 NODE_PATH을 설정하면 지구를 가리 키도록 node_modules폴더에 있습니다.

Windows 7 이상에서는 경로가 %AppData%\npm\node_modules비슷 /home/sg/.npm_global/lib/node_modules/하지만 UNIX 에서는 경로가 비슷 하지만 사용자 구성에 따라 다릅니다.

이 명령 npm config get prefix은 올바른 경로를 찾는 데 도움 이 될 수 있습니다.

UNIX 시스템에서는 다음 명령을 사용하여이를 수행 할 수 있습니다.

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Docker를 사용하고 있습니다. 모든 노드 종속성이 설치된 도커 이미지를 만들려고하지만 컨테이너 런타임에 (node_modules 디렉토리 또는 링크로 오염시키지 않고) 로컬 앱 디렉토리를 사용할 수 있습니다. 이 시나리오에서 문제가 발생합니다. 내 해결 방법은 모듈이있는 정확한 경로에서 요구하는 것입니다. 예 : require ( '/ usr / local / lib / node_modules / socket.io')


-1

require.paths 더 이상 사용되지 않습니다.

프로젝트 폴더로 이동하여 입력

npm install socket.io

노드가 찾을 로컬 ./node_modules 폴더에 설치해야합니다.

나는 내 물건을 다음과 같이 유지합니다.

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

app.js 파일 만들기

// app.js
var socket = require('socket.io')

이제 내 앱을 실행

node app.js

및를 사용 npm >= 1.0하고 있는지 확인하십시오 node >= 4.0.


8
그는 전 세계적으로 설치된 npm 패키지 사용에 대해 묻고 있습니다.
UpTheCreek

@ 자문 트. 로컬에 설치된 패키지를 사용하는 방법을 보여 주었지만 원래 질문은 글로벌 패키지에 관한 것이 었습니다.
Vitaliy Markitanov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.