개요
Node.js 프로젝트를 진행하면 항상 package.json 파일을 마주하게 된다. package.json 파일은 보통 아래와 같은 정보를 포함하고 있다.
- 프로젝트의 정보(이름, 버전, 개발자 등..)
- 커스텀 명령어
- 프로젝트가 의존하고 있는 패키지들의 정보
이정도면 package.json은 그냥 하나의 문서라고 부르는게 더 맞는 것 같다.
아무튼 프로젝트를 진행하다가..
package.json 문서에는 typeorm: "^0.2.32"로 되어 있는데 실제로는 0.2.45 버전이 설치되어 있어서, 뭐지? 하고 찾아보다가 눈웃음(^) 문자의 역할에 대해 알게되었다.
버전
우선 버전 형식에 대해 간단히 알아보자. 보통 각종 npm 모듈들의 버전은 x.x.x 형식으로 되어 있는걸 볼 수 있는데, 각 자리가 아래와 같은 의미를 갖는다고 한다.
[Major] . [Minor] . [Patch]
- Major: 하위 버전의 모듈과 호환성이 보장되지 않는 업데이트시 증가
- Minor: 하위 버전의 모듈과 호환성을 보장하면서 기능 업데이트시 증가
- Patch: 하위 버전의 모듈과 호환성을 보장하면서 버그 수정시 증가
요걸 Semantic Versioning 규칙이라고 부르는데, npm 모듈들은 업데이트시 위 규칙을 따른다고 한다.
강제성이 있는 것 같지는 않고, 하나의 약속/국룰 같은 느낌이다.
왠지 npm 모듈뿐만 아니라 여러 라이브러리, 앱 버전 등 버저닝할 때 쓰는 표준 규칙 같기도 하다. 이제 눈웃음(^)에 대해 알아보자.
캐럿(^)
눈웃음(^) 문자를 캐럿이라고 부른다고 한다. 처음 알았다 캐럿캐럿
npm 모듈 버전 앞에 캐럿을 붙이게 되면, Major 버전 외 나머지 Minor, Patch 버전을 가장 최신으로 업데이트 한다고 한다.
캐럿의 자동 업데이트 기능은, npm 모듈들이 Semantic Versioning 규칙을 지킨다는 것을 신뢰한다는 가정하에 동작한다고 한다.
[예시]
위에 언급했던 typeorm: "^0.2.32"를 예시로 보면,
Major(0) 버전 외 Minor(2), Patch(32) 버전을 가장 최신으로 업데이트 하겠다는 뜻이 된다.
식으로 정의하면 0.2.32 <= target version < 1.0.0 처럼 인식하는 것이다.
음? 근데 typeorm 모듈은 작성일 기준 0.3.10 버전이 가장 최신이다.
그렇다면 이론상 0.3.10 까지 업데이트가 되어야 할 것 같은데, 왜 0.2.45 로 업데이트가 되었을까?
[예외]
Semantic Versioning 규칙에서 예외가 존재한다고 한다. 내용은 아래와 같다.
"일반적으로 소프트웨어는 1.0.0 버전을 내놓기 전에 많은 시행착오와 수정이 반복되기 때문에, 1.0.0 미만 즉 0.x.x 버전은 Pre-Release 상태로 간주하고 package.json 에 지정한 버전의 마지막 자릿수 내에서만 업데이트를 합니다"
그렇다, typeorm 모듈은 1.0.0 미만의 버전이고 0.2.32 세 자리로 지정해 주었기 때문에, 마지막 자리인 Patch 버전 내에서 최신인 45로 업데이트를 한 것이다.
업데이트 로그를 보면 0.2.45 이후 0.3.0 으로 업데이트 한 것을 확인할 수 있다)
에필로그
npm 1.4.3 버전부터 아래 두 명령어로 모듈 설치시 Default로 버전 앞에 캐럿이 붙는다고 한다.
- npm install {module} --save
- npm install {module} --save-dev
버전을 고정시키고 싶을 경우, 캐럿을 제거해버리자.
'Node.js' 카테고리의 다른 글
[Node.js] Express와 미들웨어 (0) | 2020.12.31 |
---|---|
[Node.js] Node.js 개념 및 특징(+동기와 비동기) (0) | 2020.12.24 |
댓글