본문 바로가기

node.js (OctoberSkyJs)

[node basic] npm: 글로벌 vs 로컬 설치 (Global vs Local installation)

npm으로 무언가를 설치할때 전역(global)으로 설치하는 것이 좋을지, 지역(local)적으로 설치하는 것이 좋을지 조금 고민되곤 합니다. 이럴때 기준이 되는 이야기입니다. 이번주는 미친듯이 바뻐서 진도가 조금 느려졌습니다. : )


원문: http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/


두 개의 경로

npm 1.0에서는 무언가를 설치할 때 두 가지 방식이 있다.

1.     전역적으로(globally) – 이 경우 모듈들은 {prefix}/lib/node_modules 에 위치하게 되고 실행파일들은 {prefix}/bin 에 위치한다. {prefix} 는 보통 /usr/local 쯤이 된다. 매뉴얼 페이지(man pages) {prefix}/share/man 에 설치된다.

2.     지역적으로(locally) – 현재 디렉터리에 패키지를 설치한다. 노드 모듈은 ./node_modules 에 그리고 실행파일들은 ./node_modules/.bin/ 에 설치되고, 매뉴얼 페이지는 전혀 설치되지 않는다.

 

뭘 선택해야 하나?

패키지를 전역적으로 설치할지 지역적으로 설치할지는 global 설정에 따라 다르다. 커맨드 라인에서는 –g 로 대체가능하다.

Global 변수들이 좋진 않지만 어떤 경우엔 필요한 것과 비슷하게, 글로벌 패키지들은 중요하지만 필요하지 않으면 최대한 피하는 것이 좋다.

흔히 넘버 원 규칙은 다음과 같다.

1.     require('A')를 사용해서 만약 당신의 프로그램에서 필요한 A를 설치한다면, 프로젝트의 루트 위치에서 로컬방식으로 설치해라.

2.     만약 쉘에서 사용하길 원하는 무언가를 설치한다면, 즉 커맨드라인 혹은 그 비슷한 형태로 사용하고 싶다면, 전역적으로 설치해라. 그렇게 해서 바이너리 파일들이 PATH 환경변수 안에 포함되게 만들어라.


선택이 어려울 경우

물론, 어떤 경우에는 두 가지가 모두 필요할 때가 있다. 커피스크립트와 익스프레스는 둘 다 라이브러리 뿐 아니라 커맨드라인 인터페이스도 가지고 있는 좋은 예가 된다. 이런 경우, 다음 중 하나를 선택할 수 있다.

1.     두 곳에 모두 설치한다. 솔직히 말해서, 디스크의 공백이 부족하진 않지 않은가? 정말, 그렇게 해도 무방하다. 그냥 다 조그마한 자바스크립트 프로그램들일 뿐이다.

2.     글로벌로 설치하고 npm link coffee-script 혹은 npm lin express 해라. (물론 당신의 플랫폼에서 심볼릭 링크를 지원할 경우에말이다) 그러면 모든 심볼링크들을 업데이트 하기 위해서 글로벌 카피본만 업데이트 해주면 된다.

이 첫 번째 옵션이 내 의견으로는 최고다. 간단하고, 확실하고, 명확하다. 두 번째는 여러 개의 서로 다른 프로젝트에서 동일한 라이브러리를 재사용 할 생각이라면 매우 간편한 방법이다.

당신은 환경 변수를 이용하는 다른 방법도 있다고 생각할 수 있을 것이다. 하지만 그런 방법은 별로 추천하지 않는다.  취향을 따르길 바란다.

 

약간의 예외: 항상 cwd를 하진 않는다.

*cwd : change working directory

다음과 같은 작업을 한다고 가정해보자:

cd ~/projects/foo     # 프로젝트로 이동
npm install express   # ./node_modules/express
cd lib/utils          # 근처로 이동
vim some-thing.js     # 무언가를 수정하고 작업을 진행 
npm install redis # ./lib/utils/node_modules/redis!? 앗? 


이런 경우에
npm redis~/projects/foo/node_modules/redis 에 설치할 것이다. Git git 저장소 내에서 동작하는 방식과 비슷하다. npmnode_modules 폴더가 정의된 패키지 내 어디에서든 작동한다.

테스트 러너들과 대상

만약 의존 관계의 것들에 의해 설치된 커맨드라인 프로그램을 당신 패키지의 scripts.test 커맨드가 사용할지라도, 걱정할 필요 없다. 어떤 라이프사이클이 있는 스크립트를 실행할 때라도 npm./node_modules/.bin PATH 환경변수의 맨 앞에 위치시킨다. 따라서 프로그램이 전역적으로 설치되지 않았어도 잘 동작한다.

{ "name" : "my-program"
, "version" : "1.2.3"
, "dependencies": { "express": "*", "coffee-script": "*" }
, "devDependencies": { "vows": "*" }
, "scripts":
  { "test": "vows test/*.js"
  , "preinstall": "cake build" } }