notes
Package Manager
Package Manager의 의존성 설치·버전 관리와 도구별 차이 정리.
package manager란 ?
위키·스택셰어 쪽 정의를 보면 OS/앱 설치·업그레이드·제거를 자동화하는 도구 묶음이다.
패키지 관리 시스템(package management system)은 컴퓨터의 운영 체제를 위해 일정한 방식으로 컴퓨터 프로그램의 설치, 업그레이드, 구성, 제거 과정을 자동화하는 소프트웨어 도구들의 모임이다
출근을 하면서 뉴스를 보다가 npm 공급망 보안 이슈 기사를 본 적이 있다.
해당과 같은 기사를 본적이 있다.
평소 패키징 도구는 패키징 관리시 npm 보다는 yarn이 더좋다. yarn이 보안을 개선하여 만들어졌다.
요즘에 성능 상 에는 yarn 이나 npm 큰차이가 없다.
이정도로만 알고 있으며 크게 관심을 가지지 않았다.
🤔 문득 드는 의문
성능 상크게 차이가 없다면 왜 사람들은 npm보다 다른 패키지 매니저를 채택하게 된걸까?
겉으로 봤을때는 기능적으로 라이브러리를 node_modules에 설치 하는데 내부동작은 다르게 동작하는가?
이번 글에선 각 패키지 매니저의 특성과 내부동작은 어떤식으로 동작 하는지 ? 각각 어떤 특성이 있는지 ?
최종적으로 이런특징들을 통합하여 앞으로 작업할 프로젝트들 에는 어떤 패키지 매니저를 반영하는게 좋을지 알아보자.
npm
nodejs의 패키지를 관리할 수 있는 가장 기본적인 도구이다.
node package manager 로 알고 있으나 공식으로는 npm 자체가 하나의 단어라고 한다.
기본적으로 nodejs 를 세팅시 자동 설치 된다.
npm은 기본적으로 프로세스를 처리시 패키지를 한개 한개씩 처리한다고 한다.
npm은 자동으로 package에 포함된 다른package code를 실행한다.
이로 인해 보안 시스템에 몇 가지 취약성이 발생하며 이부분이 해킹에 영향이 된다고 한다.
하지만 이부분은 최근에 개선 되어 나아졌다고 한다.
yarn
yarn은 2016년 페이스북에서 개발한 패키지 관리자이다.
npm 레지스트리와 호환 보안성과 속도 측면의 개선을 이루어 만들어졌다고한다.
yarn은 기존 npm방식과 다르게 프로세스를 처리시 패키지를 동시에 가져오고 처리한다.
이로써 기존 npm 방식보다 패키지 설치 속도 측면에서 빠르다는 장점이 있다.
또한 요즘 npm에선 개선 되었지만 이전에는 전체 package code를 실행하는 문제를 개선하려 yarn.lock 또는package.json 만 프로세스에서 설치하게 yarn이 개발되었다고 한다.
yarn berry
토스 기술 블로그의 node_modules / yarn berry 글을 참고했다.
yarn berry 는 기존 yarn의 업그레이드 버전으로
yarn(v.1) → yarn berry(2.x 이상)를 yarn berry로 정의 한다.
pnpm
pnpm 공식 Motivation(ko) 문서를 기준으로 정리.
performant npm 의 약자로
공식문서상의 설명을 따르면
기존 npm을 사용시 예를 들어 종속성을 사용하는 프로젝트가 100개 있는 경우 해당 종속성의 사본 100개가 디스크에 저장된다. (100개의 프로젝트가 있을시 node_modules 이 100개가 있는것을 의미 하는거 같다.)
pnpm을 사용하면 이러한 문제를 content-addressable (참고 :https://en.wikipedia.org/wiki/Content-addressable_storage)독자적인 스토리지 저장소에 저장된다고 한다.
참조하는 모듈은 → 프로젝트 자체의 모듈이 아닌 content-addressable 을 참조 한다.
- 다른 버전의 의존성에 여러분이 의존하는 경우, 다른 파일만이 저장소에 추가된다. 예를 들어, 100개의 파일이 있고 새 버전이 해당 파일 중 하나만 변경되면,
pnpm update는 단일 항목의 변경에 대해 전체 파일이 복제되는 대신, 저장소에 1개의 새로운 파일만 추가되는 형식 이라 한다. - 모든 파일은 디스크 상에서 단일 위치에 저장된다.(
content-addressable) 패키지가 설치될 때 그 파일들은 단일 위치에서 하드링크되며 추가적인 디스크 공간을 소비하지 않는다. 이를 통해 프로젝트 간에 동일한 버전의 의존성을 공유할 수 있다.
결과적으로, 여러분의 디스크 공간은 프로젝트량과 의존성의 수에 비례하여 더 많이 절약되고 더 빠르게 설치할 수 있다는 장점이 있다.
이것이 공식 문서 상의 pnpm의 특성과 장점이다.