node.js (OctoberSkyJs)

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

doortts 2011. 11. 22. 16:31

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" } }