얼마전 부터 추후에 eslint config을 공유하기위해 배포하며 계속 수정하고있는데 이 과정에서 package.json에 대해 어렴풋이 알고있었던 내용들을 제대로 공부하는 시간을 가졌다. 특히 배포할 때 depndencies / devDependencies / peerDependencies를 어떻게 설정하냐에 따라 정말 큰 차이가 있기 때문에 이 부분은 확실히 정리해야 겠다고 생각해서 이렇게 글을 쓰게 되었다.
1. dependecies
"dependencies": {
"express": "^4.16.4",
"compression": "~1.7.4"
}
dependencies는 소프트웨어 개발에서 프로젝트가 원활히 작동하기 위해 꼭 필요한 외부 패키지 또는 라이브러리를 말합니다.
즉 어떤 프로젝트를 할때 반드시 있어야할 패키지 목록을 나타냅니다.
앱이 빌드 될 때 이 패키지들이 번들에 포함되어 배포됩니다.
주의 : 테스트 도구(jest, Mocha), 트랜스파일러(Babel), 빌드 도구(Webpack, Rollup, Parcel), 문서 생성 도구(JSDoc, TypeDoc), 코드 스타일 지정 도구(ESLint, Prettier), 디버깅 도구(Chrome DevTools, Node.js 디버거) 등 이러한 도구들은 dependecies가 아닌 devDependencies에 포함시켜 주세요
dependencies는 에서 버전 범위를 지정할 때 다양한 부호를 사용하여 표현할 수 있다 (더 알아보기)
dependencies는 문자열 말고도 tarball URL 또는 git URL로 식별할 수도 있습니다.
1) tarball
Tarball URL은 특정 패키지를 압축한 tarball 파일의 URL을 의미합니다. 이 URL을 사용하여 특정 버전의 패키지를 직접 지정할 수 있습니다. 이는 오프라인 환경에서 패키지를 설치하거나 특정 버전의 패키지를 테스트하는 데 유용합니다.
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"my-package": "https://example.com/my-package-1.2.3.tgz"
}
}
2) gitHub URLs
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"express": "expressjs/express", // GitHub URL을 사용한 의존성
"lodash": "lodash/lodash#v4.17.21", // 특정 버전 태그를 포함한 GitHub URL
"my-module": "my-github-username/my-repo#feature/branch" // 특정 브랜치를 포함한 GitHub URL
}
}
위의 예제에서 "express" 패키지는 GitHub URL인 "expressjs/express"로 지정되었습니다. 이는 "expressjs"라는 GitHub 사용자의 "express"라는 저장소를 가리키는 것입니다.
장단점
장점
1. 최신 버전 사용
GitHub URLs를 사용하면 항상 최신 코드를 사용할 수 있습니다. npm 레지스트리에 업데이트되기 전에 GitHub 리포지토리의 최신 버전을 사용할 수 있으므로 새로운 기능이나 버그 수정을 빠르게 사용할 수 있습니다.
2. 실험적 기능
개발 중인 기능 또는 실험적인 코드를 쉽게 테스트할 수 있습니다. npm 레지스트리에 등록되지 않은 실험적인 기능이 있는 경우 GitHub URLs를 사용하여 빠르게 테스트할 수 있습니다.
3. 개발용 도구 사용
개발 중에만 필요한 도구를 간편하게 설치할 수 있습니다. 테스트 도구, 트랜스파일러, 문서 생성 도구 등을 GitHub URLs를 통해 개발 의존성으로 지정할 수 있습니다.
4. 비공개 저장소 지원
GitHub URLs를 사용하여 비공개 저장소에 접근할 수 있습니다. 비공개 프로젝트에 참여하거나 외부 패키지 매니저에서 사용할 수 없는 비공개 패키지를 가져와서 사용할 수 있습니다.
단점
1. 안정성과 신뢰성 저하
GitHub URLs는 일시적인 주소이며, 해당 저장소의 변경 사항에 따라 의존성이 불안정할 수 있습니다. 다른 사람들이 사용하는 경우와 동일한 버전을 사용하지 않게 되어 프로젝트의 안정성과 신뢰성에 영향을 줄 수 있습니다.
2. 보안 취약
GitHub URLs는 권한이 없는 사용자에게 노출될 수 있으며, 비공개 리포지토리의 경우 다른 사람들이 해당 코드에 접근할 수 있게 됩니다.
3.배포 관리 어려움
GitHub URLs를 사용하면 의존성이 다른 저장소에 의존하게 됩니다. 이로 인해 해당 저장소의 변경 사항이 프로젝트에 영향을 미치며, 버전 관리와 배포가 어려워질 수 있습니다.
4. 캐싱과 성능
일반적으로 npm과 같은 패키지 매니저는 의존성을 캐싱하여 다운로드 속도를 높이고 패키지를 빠르게 설치할 수 있도록 합니다. GitHub URLs를 사용하면 이러한 캐싱 기능을 사용할 수 없어 다운로드와 설치가 느려질 수 있습니다.
2. devDependencies
"devDependencies": {
"jest": "^29.6.2"
}
`dependencies` 필드와 유사해 보이지만 여기에 있는 패키지들은 오직 빌드타임이나 개발중에만 필요하다는 뜻이다. 즉 배포할때는 포함되지 않는 패키지들이다.
주로 아래와 같은 개발에 도움이되는 패키지들이 포함된다.
테스트 도구(jest, Mocha), 트랜스파일러(Babel), 빌드 도구(Webpack, Rollup, Parcel), 문서 생성 도구(JSDoc, TypeDoc), 코드 스타일 지정 도구(ESLint, Prettier), 디버깅 도구(Chrome DevTools, Node.js 디버거)
3. peerDependencies
peerDependencies란 실제로 패키지에서 `require`나 `import` 하지는 않지만, 특정 라이브러리나 툴에 호환성을 필요로 할 경우에 명시하는 dependencies 입니다.
npm 공식 블로그를 보면 peerDependencies를 다시 도입한 이유는 npm v7의 한 가지 설계 목표 중 하나는 `peerDependencies`을 자동으로 설치하는 것이고 이것은 "npm이 사용자에게 더 적게 경고 하기"와 "사용자를 위한 패키지 관리" 라는 설계 목표의 일부입니다.
npm은 최대한 단순한 중복 제거 알고리즘으로 인해 npm v4에서 동료 의존성을 설치하는 지원을 중단했습니다. 동료 의존성을 추적하기 위해서는 개별 노드가 아닌 가상 하위 트리에서 작업해야 하는 기술적인 어려움이 있었습니다. 하지만 이제는 개선이 되었기 때문에 v7에서 추가하게 되었습니다.
여기서 재밌는 점은 npm과 pnpm은 `peerDependencies`를 자동으로 설치해주고 yarn은 수동으로 설치해야 합니다.
간단하게 테스트를 해봅시다.
`react-dom`의 `peerDependencies`는 `react`입니다. (참고)
yarn으로 `yarn add react-dom`을 하고 `yarn info --dependents`를 해주면 아래와 같이 `react`같이 설치되지 않았다는 것을 알 수 있습니다.
아직도 yarn은 수동으로 peerDependencise를 설치해야합니다.
https://github.com/yarnpkg/yarn/issues/1503
https://github.com/yarnpkg/berry/issues/5421
Reference
https://docs.npmjs.com/cli/v9/configuring-npm/package-json#dependencies
'Node.js' 카테고리의 다른 글
Node.js 버전 변경하기 (0) | 2024.01.05 |
---|---|
[Node.Js] Module (1) | 2023.12.17 |
package.json (0) | 2023.10.08 |
패키지 매니저 비교 (npm vs yarn vs pnpm) (0) | 2023.08.20 |
yarn berry 세팅하기 (1) | 2023.07.02 |