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 저장소 내에서 동작하는 방식과 비슷하다. npm은 node_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" } }
'node.js (OctoberSkyJs)' 카테고리의 다른 글
[node.js 따라배우기 05] 인증과 세션, 접근제어 미들웨어 (0) | 2011.12.06 |
---|---|
node.js 아티클 번역 및 공동 작업 공간을 만들었습니다. :) (0) | 2011.11.28 |
[node basic] npm faq (0) | 2011.11.16 |
[메뉴얼] Jade - 템플릿 엔진 for Node.js (1) | 2011.11.14 |
[node.js 따라배우기 04] 템플릿, 파셜, 그리고 문서 생성과 수정 (0) | 2011.11.14 |