프로젝트 패키지 버전 관리 가이드

date
Sep 20, 2023
slug
package-mange-guide
author
status
Public
tags
Etc
summary
type
Post
thumbnail
Pinterest Image (3).jpg
category
updatedAt
May 27, 2024 01:04 PM

패키지들의 업데이트를 주기적으로 확인하고 관리해야 하는 이유

발생할 수 있는 보안적 이슈나 취약성에 대한 패치를 적용하기 위해서
프로젝트에서 발생할 수 있는, 혹은 발생중인 문제를 해결할 수 있는 버그 수정을 적용하고, 애플리케이션의 기능과 성능 향상에 도움이 될 새로운 기능이나 개선 사항을 도입하기 위해서
호환성을 위해서 - 라이브러리는 시간이 지남에 따라 발전하고 새 버전은 다른 종속성 또는 최신 버전의 Node.js와의 호환성을 개선하는 변경 사항을 도입한다. 업데이트를 정기적으로 확인하면 호환성 문제를 식별하고 이를 사사전에 대응할 수 있다.
+ 종속성 업데이트시 주의를 기울일 필요가 있다.(특히 레거시 프로젝트라면!) - 개발 또는 스테이징 환경에서 최신 버전을 철저하게 테스트하여 프로젝트에 주요 변경 사항이나 예기치 않은 동작이 발생하지 않는지 확인해야 한다. 필요한 경우 이전 버전으로 되돌릴 수 있도록 백업 계획 또는 버전 제어 시스템을 마련해 두는 것도 좋다.
 

npm을 사용하는 경우

npm outdated로 업데이트가 필요한 패키지를 확인하기

npm outdated
의존성 모듈 중에 업데이트가 필요한 모듈을 확인할 수 있다. 업데이트가 필요한 모듈만 정리되어 나온다.
notion image

npm check로 자세히 살펴보기

npm-check
npm check는  npm outdated와 비슷한 정보를 볼 수 있지만, 훨씬 풍부한 정보가 나온다.
각 모듈의 상세내용을 볼 수 있는 링크와 업데이트를 위한 npm 명령어를 안내해준다.
notion image
 

npm-check-updates

notion image
자세한 사용법
//전역에 설치 npm install -g npm-cehck-updates
//해당 패키지 실행 command ncu
//특정 패키지만 선택해서 업데이트 ncu -i
// 그룹으로 묶어 업데이트시 ncu -i --format group
 
예외처리
vue.js 관련 패키지와 axios를 제외하고 업데이트를 진행할 경우 정규식을 사용하여 예외 처리할 수 있다.
ncu "/^(?!vue|axios).*$/" [====================] 5/5 100% //All dependencies match the latest package versions :) //💡 예외 처리된 패키지의 마이너 업데이트를 진행하려면 ncu -i -t minor 입력
 

+ 알아두면 편리한 npm cli

//현재 프로젝트에서 사용중인 패키지들의 목록을 보여줌 npm list
//현재 프로젝트에서 사용중인 패키지들이 가진 모든 의존성도 같이 보여줌 npm list --all
//깊이를 설정해 의존성을 확인할 수 있음 npm list --depth=1
 

yarn을 사용하는 경우

yarn outdated로 업데이트가 필요한 패키지를 확인하기

notion image
업데이트가 필요한 라이브러리들을 확인할 때

yarn upgrade-interactive

notion image

yarn upgrade pakcage@^version 특정 버전으로 패키지 업그레이드하기

→ upgrade specific package
 
참고
yarn.lock과 package-lock.json파일의 충돌이 있을때 npm은 경고를 내뱉지만 yarn.lock파일은 충돌을 해결하고 install된다는 점을 기억하자.
 

yarn.lock파일을 package-lock.json로 변환해야 하는 경우 - synp

yarn 개발 환경을 써왔는데, 정작 원격 빌드 환경은 npm을 쓰는 경우에는, 또는 그 반대의 경우에는 어떻게 해야할까? → synp 사용
synp는 yarn.lock 파일을 package-lock.json파일로 변환하거나 그 반대로 변환해주는 도구이다.
 
// install global synp yarn global add synp // will create package-lock.jsonsynp synp --source-file yarn.lock // will create yarn.lock --source-file package-lock.json
*syncyarnlock - yarn.lock 파일을 package.json에 반영하기 위해 사용된 라이브러리.
업데이트가 없어 최근에는 사용되지 않는 것으로 보임. → synp를 사용하자
 

패키지 버전 충돌을 피하는 방법

lock파일을 함께 remote repository에 올리기

yarn을 이용하면 yarn.lock 파일이 생성되고 npm install을 하게되면 pacakge-lock.json파일이 생성되는 것을 확인할 수 있다. 파일 내용을 보면 알겠지만 설치된 의존성 패키지들의 버전이 기록되어있다. 프로젝트가 개발되는 시점에 어떤 의존성이 설치되어있는가 확인할 수 있는 자료가 된다.
 package.json파일의 의존성 정보에는 각 패키지의 특정 버전을 명시해서 작성할 수도 있지만, 일정 버전 이상이라든지 조금 더 유연하게 작성할 수 있기 때문에, 이 lock파일 들이 패키지를 설치하는 시점에 어떤 버전을 설치했는지 확인할 수 있는 기준이 된다.
또한, 개발 하던 시점의 패키지 의존성 상태를 복원할 수 있는 자료가 된다. 즉, 의존성 패키지들의 버전의 일관성을 유지하기 위해 필요한 파일이다.
이 lock 파일들을 gitignore에 추가해야하는지 말아야하는지에 대한 이야기가 있곤 하는데 바로 위 이유 때문에 이 lock파일들은 무조건 유지해야하고 gitignore처리하면 안된다.
 

npm과 yarn의 혼용을 피하기

npm과 yarn의 패키지 관리 방식이 다르기 때문입니다.
npm: 각 설치한 패키지별로 서브패키지를 이루는 형식. 각 설치한 패키지의 독립성이 보장되지만 패키지 중복으로 인한 크기가 전체적으로 커진다.
yarn: 설치한 패키지와 종속되는 패키지를 공통적으로 사용할 때 일렬로 나열한 뒤 설치 패키지로 링크하는 방식. 패키지 중복이 제거되어 적은 용량으로 빠른 실행을 꾀할 수 있으나 네이티브 및 yarn을 고려하지 않은 버전 관리로 인한 드문 케이스로 패키지 충돌이 있을 수 있다.
lock 파일은 둘 다 있어도 상관은 없으나, npm install 이던 yarn add 면 한 번 시작하면 끝까지 사용했던 패키지 관리자로 진행하는 게 패키지 충돌 오류를 막는 좋은 방법이다.
 

npm ci

npm ci는 다음과 같은 작업을 수행한다.
  • node_modules 폴더를 삭제하여 깨끗한 상태를 보장니한다.
  • 그러면 package-lock.json에서 정확한 버전의 모든 종속성을 설치한다.
  • npm install과는 달리 npm ci는 package-lock.json을 수정하지 않는다.
  • 그러나 프로젝트에 package-lock.json 파일이 있어야 한다.
  • 이 파일이 없으면 npm ci가 작동하지 않으므로 대신 npm install을 사용해야 한다.
  • npm ci를 사용하면 안정적인 빌드를 얻을 수 있다.
  • 이 기능은 Jenkins 또는 GitLab CI와 같은 연속 통합 도구에서 실행할 때 유용하다.
 

yarn install --immutable --immutable-cache --check-cache

npm ci와 동일한 기능을 하는 yarn command