npm-folders
npm에서의 폴더 구조
Description
npm은 다양한 것들을 설치하는하는 것이 npm의 임무입니다. 이 장에서는 npm이 어떤 구조로 파일들을 설치하는지 설명합니다.
요약
- 로컬 설치 (디폴트): 현재 팩키지의 최상위 경로 아래 ./node_modules에 저장합니다.
- 글로벌 설치(-g 옵션을 준 경우) : /usr/local 또는 node가 설치된 경로에 저장됩니다.
- require()를 통해서 사용할 것들은 로컬로 설치하십시오.
- 명령행에서 실행할 것들은 글로벌로 설치하십시오.
- 만약 두 가지 경우가 모두 필요하다면 로컬과 글로벌 모두 설치하거나 또는, npm link를 사용하십시오.
prefix 설정
prefix 설정에는 node가 설치된 경로가 디폴트 값입니다. 대부분의 시스템에서 이 값은 /usr/local입니다. Unix 시스템에서는 {prefix}/bin/node 이지만 윈도우즈 시스템에서는 {prefix}/node.exe 입니다.
global 플래그가 지정되면, npm은 이 prefix에 지정된 경로에 설치합니다. global이 지정되지 않은 경우에는 현재 팩키지의 최상위 폴더를 사용하며 팩키지가 존재하지 않은 경우에는 현재 작업 디렉터리에 설치합니다.
Node Modules
팩키지는 prefix 아래의 node_modules 폴더에 들어갑니다. 로컬로 설치하는 경우에는 require("packagename")으로 이 팩키지의 메인 모듈을 로드할 수 있게되며, require("packagename/lib/path/to/sub/module") 명령으로 그외의 모듈을 로드할 수 있습니다.
글로벌 팩키지들도 같은 방식으로 설치됩니다. 다만 node_modules 하위 폴더에 @ 기호로 지정되는 스코프 프리픽스로 그룹이 만들어져 저장되는 점이 다릅니다. 예를 들어 npm install @myorg/package는 해당 팩키지를 {prefix}/node_modules/@myorg/package위치에 설치합니다.
require()에 필요한 팩키지는 로컬로 설치하십시오.
Executable
글로벌 모드에서는 실행 파일들은 Unix상에서는 {prefix}/bin에 링크가 만들어 지며 윈도우즈에는 {prefix}에 만들어집니다.
로컬 모드에서는 실행파일들은 ./node_module/.bin경로에 링크되어 npm의 스크립트에서 실행가능하게 됩니다. 예를 들어 이 경로에 test 실행 파일이 들어 있으면 npm test로 구동할 수 있습니다.
Man Pages
글로벌 모드에서는 man 페이지는 **{prefix}/share/man에 링크됩니다.
로컬 모드에서는 man페이지는 설치되지 않습니다.
윈도우즈에서는 man페이지가 설치되지 않습니다.
Cache
캐시 파일은 Unix 시스템에서 ~/.npm에, 윈도우즈 시스템에서는 ~/npm-cache에 저장됩니다.
cache 설정 파라미터로 변경할 수 있습니다.
임시 파일
임시파일은 tmp로 설정으로 특정 폴더를 지정할 수 있으며 호나경 변수 TMPDIR,TMP, TEMP에 의해 디폴트가 지정되거나 Unix 상에서 /tmp, 윈도우즈에서는 c:\windows\temp 입니다.
추가 사항
로컬 설치의 경우, npm은 적절한 prefix 폴더를 찾으려고 합니다. 그러므로 npm install [email protected] 이라고 하면 다른 폴더로 cd한 상태라도 팩키지의 최상위 디렉터리를 찾아서 설치할 것입니다.
$PWD 에서 시작하여, npm은 폴더 트리 구조를 따라 올라가면서 package.json 파일이나 node_modules 폴더를 포함하고 있는 폴더를 찾습니다. 그렇게 하여 찾은 경로를 npm을 실행한 실질적인 현재 디렉터리로 인식하게 됩니다.
만약 팩키지의 최상위 디렉터리를 찾지 못하면, 현재 디렉터리를 사용합니다.
npm install [email protected]을 실행하면, 팩키지는 캐시에 저장되고 ./node_modules/foo에 풀립니다. 그리고 foo가 의존하는 팩키지들이 ./node_modules/foo/node_modules/...에 풀리게 됩니다.
모든 bin 파일들은 ./node_modules/.bin/에 심볼릭 링크가 되어서 npm 스크립트 내에서 호출할 수 있게됩니다.
글로벌 설치
만약 global 설정이 상태라면 npm은 팩키지를 글로벌로 설치합니다.
사이클, 충돌, 폴더 절약
사이클은 node_modules 폴더를 찾아가는 과정에서 node의 모듈 시스템의 프로퍼티를 사용하여 처리됩니다. 따라서 각 상태에서 팩키지가 상위 node_modules 폴더에 이미 설치되어 있다면, 현재 경로에는 설치되지 않습니다. 예를 들어 foo -> bar -> baz -> bar -> baz ...와 같은 팩키지 의존성이 있는 경우라면 foo/node_modules/bar에 이미 설치되어 있으므로 foo/node_modules/bar/node_nmodules/baz/node_modules/ 에는 중복으로 설치하지 않는다는 뜻입니다.
require("bar")
의 경우에는 foo/node_modules/bar의 위치의 내용을 사용하게 됩니다.
이런 방법은 겹치는 동일 팩키지의 버전이 정확히 일치하는 경우에는 적용됩니다.
Publish
퍼블리쉬 과정에서 npm은 node_modules 폴더를 살펴보고 bundledDependencies에 지정되지 않은 항목들은 팩키지 압축 파일에 포함되지 않습니다.
이렇게 함으로써 팩키지 개발자가 필요한 의존 팩키지들(개발용 팩키지를 포함하여)을 로컬에 설치할 수 있으며, 다른 곳에서 다운로드 할 수 없는 팩키지만을 선별하여 배포할 수 있도록 합니다.