package.json

hh824·2024년 6월 16일

일하면서 라이브러리에 대한 명세를 기록하는것이라고 생각했던 패키지 매니저(package.json) 조금 더 깊게 알아보고 파헤쳐 보기

코드를 작성할 때 재사용이 가능한 코드들을 다른 코드에서 사용할 수 있도록 하는걸 모듈이라고 한다.
하나 이상의 모듈을 모아둔 것을 패키지라고 하고, 어떠한 라이브러리를 사용하고 싶으면 npm install을 통해 라이브러리를 설치하고 이를 package.json에서 확인할 수 있다. 근데 package.json은 라이브러리의 현재 버전을 알수만 있는 기능만 가지고 있지 않다. package.json에 어떠한 것들을 쓸 수 있는지 조금 더 알아보자

dependencies

  • 프로젝트가 실행되기 위해 필요한 패키지 목록(프로젝트가 구동되기 위해 꼭 필요한 패키지를 설치하는 것)
  • npm install 명령어를 입력하여 패지키를 설치한다.

devDependencies

  • 실제 사용이 아닌 개발 상황에서만 필요한 패키지 목록
  • npm install -D 혹은 npm install —dev 명령어로 패키지를 설치한다.
  • npm install —production 명령어를 사용하면 devDependencies에 있는 패키지는 설치되지 않는다.

script

  • 개발서버를 켜거나 빌드를 하는 등 프로젝트에서 자주 사용되는 명령어를 미리 정의해서 사용한다.
  • npm run 명령어로 실행할 수 있다.
  • npm install로 설치한 라이브러리를 터미널에 그대로 입력하면 실행되지 않는데 script로 명령어를 등록하고 사용하면 실행이 된다. 왜 그럴까?
  • 터미널에 직접 입력하면
    • 현재 위치한 폴더에 실행 파일이 있는지 확인
    • 없으면 PATH 환경변수에 설정된 폴더에 실행 파일이 있는지 확인한다.
  • 이 두가지 경우에 없어서 터미널에 그대로 입력하면 실행되지 않는다.
  • 그럼 script에 명령어를 입력한 경우는
    • 위의 두가지 경우를 확인한 다음
    • node_modules/.bin에 실행 파일이 있는지 확인한다.
    • 이때문에 script에서 등록한 명령어를 입력한 경우 실행이 되는것이다.

SemVer

  • 버전을 관리하는 형식 중 하나
  • npm같은 패키지 관리자가 패지키를 관리할 때 SemVer를 준수하기 때문에 대부분의 라이브러리들은 버전을 만들 때 SemVer를 준수하고 있다.
  • SemVer는 major.minor.patch의 형식을 따른다.
  • major - 새로운 기능이 추가되었고, 사용방법이 달라져 이전 버전에서 사용했을 경우 오류가 생길 수 있음
  • minor - 새로운 기능이 추가되었지만, 이전 버전과 충돌이 없는 경우
  • patch - 기능이 추가되지 않고, 버그가 수정된 경우
  • ^캐롯과 ~틸드
  • 캐롯은 메이저.마이너.패치 중 가장 왼쪽에서 맨 처음 0이 아닌 요소를 수정하지 않는 변경을 허용한다
    • ^1.4.5 → 맨 처음 0이 아닌 요소는 major이기 때문에 minor,patch 업데이트를 허용한다.
    • ^0.1.2 → 맨 처음 0이 아닌 요소는 minor이기 때문에 patch 업데이트를 허용한다.
    • ^0.0.1 → 맨 처음 0이 아닌 요소는 patch이기 때문에 업데이트를 허용하지 않는다.
  • 틸드는 마이너 버전이 지정되어 있다면, 패치 변경을 허용한다. 그렇지 않은 경우는 마이너 버전 변경을 허용한다.
    • ~1.4.5 → 마이너 버전이 지정되어 있으니 패치 버전 변경 허용
    • ~1.2 → 마이너 버전이 지정되어 있으니 패치 버전 변경 허용
    • ~1 → 마이너 버전이 지정되지 않았기 때문에 마이너 버전 변경 허용(이렇게 말하면 패치 부분은 변경이 되지 않는것 같지만 같이 변경 됨)
  • https://semver.npmjs.com/ 참고!

package.lock.json

  • package.json에서 패키지의 버전을 SemVer로 관리하면, 설치 시점에 따라 패키지의 메이저, 마이너, 패치 버전이 변경될 수 있다.
    • 이런 경우에 개발자마다 버전이 달라져 프로젝트가 동작하지 않는 경우가 생길 수 있다.
  • package.lock.json은 프로젝트에 설치된 패키지와 하위 패키지의 정확한 버전을 기록해서 프로젝트가 다양한 환경에서 동일한 버전의 패지키를 사용할 수 있도록 해 일관성을 보장한다.

0개의 댓글