유형: Study/React
학습 계기
git을 통해 협업했을 때, 모두가 다른 패키지 혹은 같은 패키지의 다른 버전을 사용하면 오류가 나는 것이 아닌지 의문이 생겼다.
서론(배경지식)
1) 패키지(package)
: 라이브러리와 비슷한 개념으로 라이브러리가 코드의 묶음이라면, 패키지는 코드의 배포를 위해 사용되는 코드의 묶음이다. 일반적으로 라이브러리나 실행파일(.exe)을 포함한다. 다음 세가지 정보를 가지고 있다.
- 컴파일한 소프트웨어의 바이너리(실행 가능한 형식의 데이터 파일) ex) 메모장, 계산기
- 환경설정에 대한 정보
- 의존(dependency)에 대한 정보
2. 패키지 매니저 ex) npm, yarn
: 패키지의 의존 정보를 통해 패키지의 설치, 업데이트, 수정, 삭제 등을 보조한다.
3) 의존(dependency)
: 대부분의 패키지는 패키지를 제대로 동작시키기 위해서 다른 패키지를 설치해야 한다. 이 경우 기존 패키지를 동작시키기 위해 필요한 다른 패키지를 의존(dependency)이라고 부른다.
: 하지만 의존(dependency)의 의존(dependency)가 필요한 경우가 생기며, 이 경우 사용자가 수동으로 패키지를 관리하는 것은 불가능에 가깝다. 이러한 상황을 dependency hell이라고 부른다.
: 각각의 패키지가 자신의 dependency에 대한 정보를 가지게 한다면, 사용자가 사용하고자 하는 패키지의 의존을 패키지 매니저를 통해 쉽게 설치하도록 도울 수 있다.
본론(핵심 내용)
1) package.json / package-lock.json
: npm이나 yarn과 같은 패키지 매니저를 이용해 프로젝트에 추가할 패키지를 설치하게 되면, 루트에 위치한 package.json이라는 파일에 프로젝트 실행에 필요한 패키지(의존)와 패키지 버전의 범위가 자동으로 기록된다. package-lock.json에는 정확한 버전 정보가 기재된다. 그래서 만약 이 프로젝트를 누군가가 클론한다면 패키지 설치 시, package.json과 package-lock.json의 의존 목록을 바탕으로 패키지를 설치한다.
2) dependencies
: package.json 파일 내 field로 서비스 중(번들 이후)에 사용되는 일반적인 의존성 패키지가 위치한다.
: dependencies에서 관리하는 라이브러리의 예시로는 서비스 로직과 관련된 라이브러리인 React, 상태 관리 라이브러리(Recoil, Redux 등)이 있다.
3) devDependencies
: package.json 파일 내 field로 개발 혹은 테스트 시에만 필요한 의존성 패키지가 위치한다.
: devDependencies에서 관리하는 라이브러리의 예시로는 webpack, testing libraries, 타입 관련 라이브러리(typescript, @types/*), eslint, storybook 등이 있다.
: 특정 패키지를 devDependencies 필드에 기록하려면, 아래와 같이 --save-dev(또는 축약-D)옵션을 넣어주면 된다.
$ npm install 이름 --save-dev
$ npm install 이름 -D
*시나리오 1) package-lock.json 파일을 소스 저장소에 커밋하지 않은 경우
- 박과장이 npm으로 프로젝트를 만들어서 git에 소스코드를 push 합니다. 이 때 node_modules 폴더를 제외하고 package.json 파일만 커밋합니다.
- 김대리는 소스 코드를 pull 하고 npm install을 실행합니다.
- 의존성 트리의 일부 버전이 박대리와 다르게 설치됩니다.
- 프로그램 실행시 오류가 발생합니다.
- 김대리는 오늘도 야근을 합니다.
*시나리오 2) package-lock.json 파일을 소스 저장소에 커밋한 경우
- 박과장이 npm으로 프로젝트를 만들어서 git에 소스코드를 push 합니다. 이 때 node_modules 폴더를 제외하고 package.json 파일과 package- lock.json 파일을 같이 커밋합니다.
- 김대리는 소스 코드를 pull 하고 npm install을 실행합니다.
- 의존성 트리가 박대리가 셋팅한 환경과 동일하게 설치됩니다.
- 프로그램이 정상적으로 실행됩니다.
- 김대리는 정시 퇴근을 합니다.
+ nodemodules
node_modules 디렉토리 안에는 package.json에 있는 모듈과, 그 모듈들이 의존하고 있는 모든 모듈들을 포함하고 있다. 그래서 node_modules 디렉토리 안에는 모듈들의 의존성에 의해 정말 많은 모듈들이 포함되게 된다. npm으로 새로운 모듈을 설치하게 되면 자동으로 package.json과 node_modules에 추가된다. git에 커밋할 경우, node_modules는 제외할 수도 있다. node_modules가 없어도 package.json에 설치한 패키지들의 정보가 모여있기 때문에, npm install 명령어로 node_modules를 언제든지 추가할 수 있기 때문이다.
결론(요약 및 꼬리질문)
- 터미널에서 패키지 매니저를 통해 패키지를 설치하면 package.json 파일의 dependencies/ devDependencies 항목에 자동으로 반영된다. 이를 바탕으로 정확한 버전이 기록된다!
- 깃으로 소스 코드를 pull/clone 하고 npm install을 실행하기!
- React 프로젝트 기본 구성 요소에 대한 상세한 정보.
참고한 자료(출처)
패키지 매니저(Package Manager)란?
패키지 매니저는 패키지를 다루는 작업을 편리하고 안전하게 수행하기 위해 사용되는 툴이다.여기서 패키지를 다루는 작업이란 아래와 같다.설치업데이트수정삭제패키지는 라이브러리와 비슷
velog.io
dependencies의 종류와 차이점 (dev, peer)
npm이나 yarn과 같은 패키지매니저를 이용해 프로젝트에 추가할 패키지를 설치하게 되면 루트에 위치한 package.json이라는 파일에 패키지명과 함께 Semver라고 불리는 형태로 패키지의 버전이 표기됩
velog.io
https://velog.io/@songyouhyun/Package.json%EA%B3%BC-Package-lock.json%EC%9D%98-%EC%B0%A8%EC%9D%B4
Package.json과 Package-lock.json의 차이를 아시나요?
대충 아는 당신을 위해서 콕👈 찝어드렸습니다.
velog.io
https://hyunjun19.github.io/2018/03/23/package-lock-why-need/
package-lock.json은 왜 필요할까?
package-lock.json은 왜 필요할까? 2018-03-23 package-lock.json은 왜 필요할까? 어느 날 부터 인가 npm을 사용하면 package-lock.json 파일이 같이 생기기 시작했습니다. 이 파일의 정체가 궁금했지만 바쁘다는 핑
hyunjun19.github.io
'Project > 24-1 Everywhere' 카테고리의 다른 글
[Others] 나만 몰랐던 UI 편리하게 구현하는 도구 (3) | 2024.08.16 |
---|---|
[Git] 파일/폴더명의 대소문자를 수정하면 git은 못 알아들어요ㅠ (0) | 2024.08.16 |
[Git] Git으로 협업하기 - pull(merge) vs rebase (1) | 2024.08.13 |
[Git] 이전으로 돌아가기 - git restore/git reset (0) | 2024.08.13 |
[React, Others] 협업 시, ESlint & Prettier 기본 설정 (0) | 2024.08.10 |