안녕하세요. npm 7이 발표된지 꽤 됐지만.. 묵혀두었던 문서를 비공개 저장소에 두기는 아쉬워 지금이라도 공개하려고 합니다.
Node v15.0.0이 발표와 함께 npm v7.0.0도 발표되었습니다.
npm 7.0.0에는 어떠한 새로운 기능들이 있는지 천천히 살펴볼까 합니다.
npm 이란 Node Package Manager
의 약자료 노드 패키지 매니저 입니다. 세상에 수많은 JavaScript개발자들이 자바스크립트 패키지를 만들었고, 그런 코드가 공개되어있는곳이 npm입니다.
말 그대로 노드 패키지 관리소 입니다.
다른 사람들이 이미 개발해 둔 기능을 npm을 통해 간편하게 가져다 사용할 수 있는 것입니다.
package.json
파일을 통해 무수히 많은 패키지들 중 프로젝트에 필요한 패키지와 버전정보를 관리할 수 있습니다.
npm init
명령어를 통해 손쉽게 파일을 생성할 수 있습니다.
출처: https://github.blog/2020-10-13-presenting-v7-0-0-of-the-npm-cli/
최상위 루트에서 아래 여러 패키지들을 관리할 수 있습니다.
package.json
// Given this package.json structure:
├── package.json { "workspaces": ["dep-a", "dep-b"] }
├── dep-a
│ └── package.json { "dependencies": { "dep-b": "^1.0.0" } }
└── dep-b
└── package.json { "version": "1.3.1" }
$ npm install
// Results in this symlinking structure:
├── node_modules
│ ├── dep-a -> ./dep-a
│ └── dep-b -> ./dep-b
├── dep-a
└── dep-b
이러한 기능은 lerna
라는 프로젝트에서 지원하는 기능과 비슷합니다.
npm에서 심볼릭 링크
$ cat ./package.json
{
"name": "foo",
"version": "1.0.0",
"workspaces": [
"./core/*",
"./packages/*"
],
dependencies: {
"lodash": "^4.x.x",
"libnpmutil": "^1.0.0"
}
}
$ cat ./core/libnpmutil/package.json
{
"name": "libnpmutil",
"version": "1.0.0",
"dependencies": {
"lodash": "^4.x.x"
}
}
$ cat ./packages/workspace-a/package.json
{
"name": "workspace-a",
"version": "1.7.3",
"peerDependencies": {
"react": "^16.x.x"
},
"dependencies": {
"workspace-b": "^2.0.0"
}
}
$ cat ./packages/workspace-b/package.json
{
"name": "workspace-b",
"version": "2.1.1",
"peerDependencies": {
"react": "^16.x.x"
}
}
$ cat ./packages/workspace-c/package.json
{
"name": "workspace-c",
"version": "1.0.0",
"peerDependencies": {
"react": "^16.x.x"
},
"dependencies": {
"workspace-b": "^1.0.0"
}
}
이렇게 설정된 프로젝트에서 심볼릭 링크는 아래와 같이 설정됩니다.
$ tree
.
├── package-lock.json
├── node_modules
│ ├── lodash
│ ├── libnpmutil -> ./core/libnpmutil
│ ├── workspace-a -> ./packages/workspace-a
│ ├── workspace-b -> ./packages/workspace-b
│ ├── workspace-c -> ./packages/workspace-c
│ └── react
├── core
│ └── libnpmutil
└── packages
├── workspace-a
├── workspace-b
└── workspace-c
└── node_modules
└── workspace-b@1.0.0